热门标签 | 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



推荐阅读
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
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社区 版权所有