windows窗口多线程 其中遇跨线程的使用控件
2011-02-28 17:02
344 查看
1.在跨线程使用控件时, 会遇到线程安全使用控件 如何处理呢
首先定义一个处理的 委托 来处理该问题
在判断 控件 的InvokeRequired(必须调用) 如果为真 那么 初始化委托 在在当前线程调用委托 this.Invoke(委托,new object[]{paramet1,paramet2,...});
例:
private delegate void GetClientMsg(string msg);//定义接受信息的委托 (*进行的线程安全调用)
//处理信息
private void ReceiveMsg(string msg)
{
if (this.richTextBox1.InvokeRequired) //检查 其他线程是否调用 控件
{
GetClientMsg get = new GetClientMsg(ReceiveMsg);//如果有其他线程调用利用委托 来完成
this.Invoke(get, new object[] { msg });//调用当前委托 来完成追加信息
}
else
{
this.richTextBox1.Text += msg; //,若未在其他线程中访问,可直接赋值
}
}
}还有一种更好的扩展方法:public
static
class Extensions {
public
static
void SafeCall(this
Control ctrl, Action callback) { if (ctrl.InvokeRequired)
ctrl.Invoke(callback);
else
callback(); } }
首先定义一个处理的 委托 来处理该问题
在判断 控件 的InvokeRequired(必须调用) 如果为真 那么 初始化委托 在在当前线程调用委托 this.Invoke(委托,new object[]{paramet1,paramet2,...});
例:
private delegate void GetClientMsg(string msg);//定义接受信息的委托 (*进行的线程安全调用)
//处理信息
private void ReceiveMsg(string msg)
{
if (this.richTextBox1.InvokeRequired) //检查 其他线程是否调用 控件
{
GetClientMsg get = new GetClientMsg(ReceiveMsg);//如果有其他线程调用利用委托 来完成
this.Invoke(get, new object[] { msg });//调用当前委托 来完成追加信息
}
else
{
this.richTextBox1.Text += msg; //,若未在其他线程中访问,可直接赋值
}
}
}还有一种更好的扩展方法:public
static
class Extensions {
public
static
void SafeCall(this
Control ctrl, Action callback) { if (ctrl.InvokeRequired)
ctrl.Invoke(callback);
else
callback(); } }
相关文章推荐
- Windows 窗体控件中的多线程处理之:如何使用后台线程搜索文件
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- c# winform下使用多线程时在线程里如何安全访问窗体控件InvokeRequired
- 多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)
- 多线程编程题目:使用三个线程有序输出“1,2,3,1,2,3。。。”,其中线程1只输出1,线程2只输出2,线程3只输出3
- windows多线程之----通过隐藏窗口进行线程间通信!
- 使用多线程提高 Windows 窗体应用程序的性能时,必须注意以线程安全方式调用控件
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- 使用BackGroundWorker在多线程中访问Winform控件,当不是创建这个控件的线程访问控件时,把线程调整到是创建这个控件的线程去控制。,代码为红色的
- 支持多线程的日志类,可以在线程中使用,用来与主窗口通讯
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- 使用windows窗口界面来删除域控制器或域
- Delphi XE8环境下使用windows下API函数创建一个空白窗口
- 转载 [WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary
- 8.多线程学习--使用线程本地变量
- windows下使用git管理代码,其中出现的问题的解决办法
- 使用Windows系统提供的IP控件
- VC2008 Windows Media Player控件的使用技巧(三)
- .NET Framework中定时器timer的单线程与多线程使用讲解
- Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定之二:使用外部URL的XML文件)