面朝大海,春暖华开

focus on scientific computue, 3dgis, spatial database
专注于科学计算、GIS空间分析

 

使用匿名函数在后台线程中设置窗体控件属性 ()转

转自 http://www.cnblogs.com/evlon/archive/2009/10/24/1589344.html

    在使用Dotnetfx2.0开发WinForm程序时,经常需要使用后台线程来进行运算,并把运算的过程数据,结果数据等信息更新显示到窗口中。由于窗体线程和工作线程不是一个线程,我们不能在工作线程中直接设置窗体中控件的属性,而需要使用Control.Invoke(Delegate del,...)来间接调用。其实,可以使用一个匿名函数很简单的调用。

    按照MSDN上的标准作法,如果有一个函数:

 

void WriteMessage(string msg)
{
    
this.tbMsg.Text += msg;
}

 

要在工作线程函数中调用,需要先声明一个委托:

 

public delegate void WriteMessageHandle(string);

 

然后在线程函数中调用:

 

public void ThreadProc(object obj)
{
     ..
     
this.Invoke(new WriteMessageHandle(this.WriteMessag, new object[]{"hello world"}));
     ..
}

 

     其实,就为了一句: this.tbMsg.Text += msg; 费了多大事呀。 其实,在C# 2.0中, 我们可以很简单:
复制代码
// 先声明这样一个万用的委托
public delegate void VoidDelegate();

public void ThreadProc(object obj)
{
      
//这是要输出的消息
      string msg = "Hello World";
      .
      
//由于是在工作线程中,我们不用理 this.InvokeRequired,直接调用
     
//直接使用匿名函数,这样可以使用 msg 局部变量,哈哈 简单吧
      this.Invoke(new VoidDelegate(delegate()
      {
            
//这句就是要执行的函数了
            this.tbMsg.Text += msg;
            
            
//这里还可以调用其它的窗体相关的代码
         
// EX
           
// this.tbName.Text = "my name here ";
      }));
      .
}
复制代码
 

posted on   风过 无痕  阅读(372)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

统计

向日葵支付宝收钱码
点击右上角即可分享
微信分享提示