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# 多线程 异步加载 窗体

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

  • 相关阅读:
    css中单位的使用
    css中max-width和min-width的应用
    css-样式初始化
    html中map标签和area标签的应用
    html中常见的小问题(1)
    防止图片被盗用
    关于thinkphp的__construct和_initialize
    禁用cookie后如何使用session还有session_id的使用
    is_null(self::$_instance) && self::$_instance = new self();
    echo、print、print_r、printf、sprintf、var_dump的区别
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/10691200.html
Copyright © 2011-2022 走看看