一、System.Windows.Forms.MethodInvoker 类型是一个系统定义的委托,用于调用不带参数的方法。
private Thread myThread;
private void Form1_Load(object sender, EventArgs e)
{
myThread = new Thread(new ThreadStart(RunsOnWorkerThread));
myThread.Start();
}
private void RunsOnWorkerThread()
{
MethodInvoker mi = new MethodInvoker(SetControlsProp);
BeginInvoke(mi);
}
private void SetControlsProp()
{
label1.Text = "myThread线程调用UI控件";
}
二、直接用System.EventHandle(可带参数)
private Thread myThread;
private void Form1_Load(object sender, EventArgs e)
{
myThread = new Thread(new ThreadStart(RunsOnWorkerThread));
myThread.Start();
}
private void RunsOnWorkerThread()
{
//DoSomethingSlow();
string pList = "myThread线程调用UI控件";
label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);
}
//直接用System.EventHandler,没有必要自定义委托
private void UpdateUI(object o, System.EventArgs e)
{
//UI线程设置label1属性
label1.Text = o.ToString() + "成功!";
}
三、演示程序
/// <summary>
/// 提供给系统委托事件调用,解决线程内操作界面控件的目的
/// </summary>
/// <param name="obj"></param>
/// <param name="e"></param>
private void UpdateListBox(object obj,System.EventArgs e)
{
//强制类型转换
List<String> paramList = (List<string>)obj;
if (paramList[0] == "0")
{
this.lstBoxCatchData.Items.Clear();
}
else if (paramList[0] == "1")
{
this.lstBoxCatchData.Items.Add(paramList[1].ToString());
}
}
线程中调用部分:
//初始化参数列表
List<String> paramList = new List<string>();
paramList.Add("0");
paramList.Add("");
//这里采用系统委托的方式,实现线程内操作系统界面控件。
paramList[0] = "0"; paramList[1] = "清除屏幕信息";
lstBoxCatchData.BeginInvoke(new System.EventHandler(UpdateListBox), paramList);
结束。
分享到:
相关推荐
访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问...
下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助
跨线程访问Windows窗体控件,线程带多参数。 跨线程访问Windows窗体控件,线程带多参数。
C#之线程、委托,强强联手操作窗体控件源码 本例子在VS2008下测试成功
C# Winform 利用线程延时创建子窗体并且可跨线程控制主窗体的控件
本资源内容:1、线程A访问非线程A创建的控件的三种方式 2、线程中创建的窗体置顶显示ShowDialog的方法。
程序很简单,在窗体上,只在说明委托方式访问控制的基本套路,在窗体上共有三个控件,一个文本框,一个安全访问按钮,一个非安全访问按钮;点击非安全访问按钮则启动线程直接访问窗体上的文框,这里调试时会出错,...
委托回调
c#编程跨线程调用窗体的方法 文中没有过多的理论说明 采用例证方式对该方法进行了说明,简单易懂 适合新手入门
form1中开启线程thread,thread的方法crossthreadaddnum在类cross中实现在crossthreadaddnum中调用form1中的listbox1
c#中跨线程调用windows控件 c#中跨线程调用 c#中跨线程调用UI控件 c#中跨线程调用UI c#中跨线程调用windows控件 c#中跨线程调用 c#中跨线程调用UI控件 c#中跨线程调用UI
多线程和委托需要自己处理资源释放 否则程序非正常退出时会仍然驻留内存 6.backGroundWorker看来是微软针对此要求度身定做的成熟组件,封装了线程、同步协调及资源释放,又没有运行安全问题的担心 7.性能哪个最好...
C#多线程编程实例 线程与窗体交互源码,该示例演示如何在线程安全的模式下调用Windows窗体上的控件。
WinForm(C#)中跨线程访问控件的解决方法 由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨...2、通过委托的方式,在控件的线程上执行
项目需要个等待窗体,网上没找到现成的,Dev及第三方控件又不能采用,综合了一下网上的资料,个人能力有限,写不出特NB的代码来,代码很简单,实现了等待窗体的功能,对我来说是万事大吉了,现在放出来,分享给有...
C#多线程窗体控件安全访问.txt C#多线程使用TextBox控件 .txt C#多线程注意点.txt Control的Invoke和BeginInvoke.txt Invoke和BeginInvoke的真正含义.txt NET异步调用模式.txt TreeView更新线程.txt url.txt VB.NET...
c#跨线程调用窗体上的控件。实现跨线程控制窗体上控件的好例子。
这是我自己学习中的一些源代码,加了一些我自己的理解注释,包括了,多线程,事件和委托(带参数和不带参数)...winform子线程调用窗体控件,委托多路广播。都是单独的一个知识点一份源代码,看起来应该是比较容易的。
使用开发工具为VS2013;.net:4.0 多线程异步刷新ui界面,实时获取任务进度并进行反馈。