zoukankan      html  css  js  c++  java
  • [转]C#通过委托更新UI(异步加载)

    我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗体加载的时候,会进行其他的操作:

    1.如果是在加载之前进行其它操作,则整个界面出来的很慢,而且若是时间长的话,页面很久才能出来;
    2.如果是写在加载之后处理的话,虽然界面出来了,这个时候,出现了假死的状体。但是不能乱点,一点,就有卡死的现象。
    现在我们利用异步和多线程来控制,并且加上进度条。来做一个界面加载的时候出现很大操作。
    示例:

    using System.Windows.Forms;
    using System.Threading;
    using System;
     
    namespace Threaddemo1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            delegate void aa(string s);//创建一个代理
     
            private void Form1_Load(object sender, EventArgs e)
            {
                Thread newthread = new Thread(new ThreadStart(ttread));
                newthread.Start();
            }
            void ttread()
            {
                pri("77");
            }
            private delegate void ProgressBarShow(int i);
            private void pri(string p)
            {
                bool name = richTextBox1.InvokeRequired;
                //MessageBox.Show(name.ToString());
                if (!richTextBox1.InvokeRequired)//判断是否需要进行唤醒的请求,如果控件与主线程在一个线程内,可以写成if(!InvokeRequired)
                {
                    Loadthread();
                }
                else
                {
                 //   MessageBox.Show("不是同一个线程");
                    aa a1 = new aa(pri);
                    Invoke(a1, new object[] { p });//执行唤醒操作
                }
            }
     
            private void Loadthread()
            {
                string s = string.Empty;
                for (int b = 0; b < 10000; b++)
                {
                    this.ShowPro(b);
                    s += b.ToString();
                }
                //MessageBox.Show("同一线程内");
                LoadRichebox(s);
            }
            void send() {
                Thread.CurrentThread.Abort();
            }
            private void LoadRichebox(string s)
            {
                richTextBox1.Text = s;
            }
            private void ShowPro(int value)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new ProgressBarShow(ShowPro), value);
                }
                else
                {
                    this.progressBar1.Value = value;
                    this.label1.Text = value + "% Processing...";
                }
            }
        }
    }

     


    ---------------------
    作者:狂奔小蜗牛
    来源:CSDN
    原文:C# 多线程 异步加载 窗体

    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    【秒懂音视频开发】10_PCM转WAV
    【秒懂音视频开发】09_播放PCM
    【秒懂音视频开发】08_音频录制02_编程
    【秒懂音视频开发】07_音频录制01_命令行
    【秒懂音视频开发】06_Qt开发基础
    高考数学考点关联表[Ⅳ]
    高考数学考点关联表[Ⅲ]
    高考数学考点关联表[Ⅱ]
    高考数学考点关联表[Ⅰ]
    反比例函数
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/10691200.html
Copyright © 2011-2022 走看看