在界面的子线程中操作界面控件
通常,会有这样的需求与问题:运行了一个窗体,触发某个事件后需要做一些处理,而这个处理可能比较耗时间或者耗资源,如果直接在消息响应中处理,运行起来界面会假死。这个时候,我们想到了多线程,新建一个子线程来处理这个过程,然后将处理的结果告诉界面线程,并在界面上体现出来给用户看。这样就出现了一个问题,子线程显示结果给用户时,需要操纵界面线程管理的控件,而当子线程没有释放这个控制时,控件也会出现假死,因为界面线程不能及时绘制控件了。
处理方法:使用委托,将子线程操作控件的部分委托给界面线程去做。
例子
通常的实现如下:
代码
1 private void queryButton_Click(object sender, EventArgs e)
2 {
3
4 Thread queryThread = new Thread(new ThreadStart(query));
5
6 queryThread.start();
7
8 }
9
10 private void query()
11 {
12
13 queryTextbox.text = "queryThread result";
14
15 }
修正:
代码
1 //1.增加一个
2 delegate void queryFunDelegate();
3
4 //2.新加一个函数
5 private void sinvoke()
6
7 {
8
9 this.Invoke(new queryFunDelegate(query));
10
11 }
12
13 //3.之后重新调用
14 private void queryButton_Click(object sender, EventArgs e)
15
16 {
17
18 Thread queryThread = new Thread(new ThreadStart(sinvoke);
19
20 queryThread.start();
21
22 }
23
24 //4.处理函数
25 private void query()
26 {
27
28 queryTextbox.text = "queryThread result";
29
30 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥