C#初学点滴-关于在异步操作中更新主线程控件的问题
在使用异步操作的时候不要直接调用不是它创建的变量。
一般的控件(按钮、文本框…)都会在一个Form中通过“设计”视图来加入,这种控件一般都是由主线程产生的。在使用异步操作时,有时候会更新这些控件(如读取文件时更新进度),可是直接在异步操作中使用不是它产生的控制是不允许的,如下:
// label1是由主线程产生的 label1.Text = "Start"; // 没问题 //...do something // 以下方法由 异步操作调用(非主线程) void fun1() { label1.Text = "Finish"; // 这是不允许的 }
需要更新主线程里的控制,有二种方法(目前我所学习到的)
1、在异步操作开始的时候声明:
Form.CheckForIllegalCrossThreadCalls = false;
2、使用控件的Invoke方法:
控件的Invoke方法大概意思是先停止当前的线程,返回主线程执行,执行完成后再回到当前线程。
123456789101112131415// 以下语句在异步操作中执行
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(
"完成"
);
}
第一种方法应该避免使用,使用第二种方法是明智选择。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· 博客园2025新款「AI繁忙」系列T恤上架
· 记一次 .NET某固高运动卡测试 卡慢分析
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提