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

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

posted @   rainbow70626  阅读(1108)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示