C#初学点滴-关于在异步操作中更新主线程控件的问题

在使用异步操作的时候不要直接调用不是它创建的变量。

一般的控件(按钮、文本框…)都会在一个Form中通过“设计”视图来加入,这种控件一般都是由主线程产生的。在使用异步操作时,有时候会更新这些控件(如读取文件时更新进度),可是直接在异步操作中使用不是它产生的控制是不允许的,如下:

// label1是由主线程产生的
label1.Text = "Start";  // 没问题
//...do something

// 以下方法由 异步操作调用(非主线程)
void fun1()
{
    label1.Text = "Finish";   // 这是不允许的
}

需要更新主线程里的控制,有二种方法(目前我所学习到的)

1、在异步操作开始的时候声明:

Form.CheckForIllegalCrossThreadCalls = false;
2、使用控件的Invoke方法:
控件的Invoke方法大概意思是先停止当前的线程,返回主线程执行,执行完成后再回到当前线程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 以下语句在异步操作中执行
object[] args = { this, System.EventArgs.Empty };
webBrowser1.Invoke(new System.EventHandler(SubmitForm), args);
 
// 以下方法就可以安全的操作主线程的控件了
        private void SubmitForm(object o, System.EventArgs e)
        {
            //Thread.CurrentThread.IsBackground = false;
            //MessageBox.Show("Go here");
            HtmlElement submit = MyForm.webBrowser1.Document.GetElementById("postsubmit");
            //MessageBox.Show(MyForm.webBrowser1.DocumentText.ToString());
            submit.InvokeMember("Click");
            FindLoutStop();
            MessageBox.Show("完成");
        }
第一种方法应该避免使用,使用第二种方法是明智选择。
posted @   OpenUSB  阅读(1893)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
阅读排行:
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· 博客园2025新款「AI繁忙」系列T恤上架
· 记一次 .NET某固高运动卡测试 卡慢分析
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提
点击右上角即可分享
微信分享提示