程序地带

C#-WinForm跨线程修改UI界面


背景

在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误:



 


 


解决思路

.Net提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是ThreadPool+ delegate的方式完成跨线程对UI对的修改。


实例代码

1、定义委托,把内容写在控件里面


private delegate void SetLabelDelegate(string value);
private delegate void SetLabelDelegate2(string value);
private void SetText(string value)
{
if (this.InvokeRequired)
{
SetLabelDelegate d = new SetLabelDelegate(SetText);
this.Invoke(d, new object[] { value });
}
else
{
txtbigcrmresult.Text = value.ToString() + txtbigcrmresult.Text;
}
}

 


2、定义方法,线程调用


private void button3_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(dao), "test");
}
private void dao(object url)
{
IDbConnection conn = new SqlConnection(txtbigcrmui.Text);
SetText(" " + "start");
.........................
SetText(" " + "end");
}

 


 

3、更新ui控件 


SetText(" " + "start");

 


 
总结

1、使用delegate实现跨线程更新UI;


2、使用ThreadPool实现多线程执行方法,避免卡顿;


 



 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lyl6796910/p/14228776.html

随机推荐

leetcode148. 排序链表

题目:给你链表的头结点head,请将其按升序排列并返回排序后的链表。进阶:你可以在O(nlogn)时间复杂度和常数级空间复杂度下,对链表进行排序...

圆滚滚的柴柴 阅读(591)

HashMap 插入、扩容、查询、删除原理源码分析

一、前言上一章我们主要介绍了HashMap中的数据结构、hash算法等知识点,除了这些,HashMap中还有插入、删除、查找等基本的功能。在面试中可能还会经常问到HashM...

猿博园 阅读(358)

是指什么_7nm 制程工艺到底指什么?

随着消费电子产品市场的火热,就算是科技小白,对于7nm制程工艺这个词也是有所耳闻的,那么7nm制程工艺到底指的是什么呢?7nmCPU对于上大学时...

社区里的故事王 阅读(102)

Linuk常用命令

Linuk常用命令whoami查看当前用户名whichnginx查看nginx等用户安装程序、命令的位置及是否存在whereiscat查看cat等系统程序、命令的位置及是否存在pwd查看当前文件夹完整...

zxc1374274813 阅读(632)

leetcode刷题之递归

leetcode刷题之递归递归的套路:终止条件(在前面进行判断)+递归关系式(在后面)tips:带有bool...

国科大小渣渣 阅读(535)

回归特征选取_[特征选择]特征重要性

特征重要性指的是根据输入特征在预测目标变量时的有用程度给它们打分的技术。计算特征重要性的方法很多,如统计上的相关系数,线性模型的相关系数、决策树和排列重要性分数。下面从以下...

宣博 阅读(409)