热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在使用Dotnetfx2.0开发WinForm程序时,经常需要使用后台线程来进行运算,并把运算的过程数据,结果数据等信息更新显示到窗口中。

    在使用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";
      dot.gif.
      
//由于是在工作线程中,我们不用理 this.InvokeRequired,直接调用
     
//直接使用匿名函数,这样可以使用 msg 局部变量,哈哈 简单吧
      this.Invoke(new VoidDelegate(delegate()
      {
            
//这句就是要执行的函数了
            this.tbMsg.Text += msg;
            
            
//这里还可以调用其它的窗体相关的代码
         
// EX
           
// this.tbName.Text = "my name here ";
      }));
      dot.gif.
}
示例2:工作线程中,使用线程池进行工作,这里还有最大并发控制哟(不知道你们如何实现最大并发):
// 先声明这样一个万用的委托
public delegate void VoidDelegate();

public void ThreadProc(object obj)
{
        
//假设,并发值为 5
        Semaphore poolLock = new Semaphore(55);
        
        
//假设 this.WorkItems 是需要进行的工作
        foreach(WorkItem workItem in this.WorkItems)
        {
            
//闭包
            WorkItem item = workItem; 
            
            
//保确不超过并发最大值
            poolLock.WaitOne();
            
            
//使用线程池进行执行,示例使用系统线程池
            ThreadPool.QueueUserWorkItem(delegate(object arg)
            {
                
try
                {
                    
//这是要输出的消息
                    string msg = item.Message; // "Hello World";
                    dot.gif
                    
//由于是在工作线程中,我们不用理 this.InvokeRequired,直接调用
                    
//直接使用匿名函数,这样可以使用 msg 局部变量,哈哈 简单吧
                    this.Invoke(new VoidDelegate(delegate()
                    {
                        
//这句就是要执行的函数了
                        this.tbMsg.Text += msg;
                        
                        
//这里还可以调用其它的窗体相关的代码
                     
// EX
                       
// this.tbName.Text = "my name here ";
                    }));
                    dot.gif
                    
                }
                
finally
                {
                    
//最后进行释放 并发锁
                    poolLock.Release();
                }
            });
        }
        
}

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



推荐阅读
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 原文地址:https:blog.csdn.netqq_35361471articledetails84715491原文地址:https:blog.cs ... [详细]
  • 在开发过程中,有时需要提供用户创建数据库的功能。本文介绍了如何利用 .NET 和 ADOX 在应用程序中实现创建 Access 数据库,并详细说明了创建数据库及表的具体步骤。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 本文探讨了如何高效地计算数组中和为2的幂的偶对数量,提供了从基础到优化的方法。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
author-avatar
流纸香p_455
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有