`

初探.NET多线程

阅读更多
         好多天没有更新Blog了,一直都在忙着寻找如何将IronPython集成至GUI中的方法。一开始我把问题看得太简单了,因为我看了来自CodeProject的ShellControl - A console emulation control这篇文章之后,很幼稚地认为只需要把源代码中的cmd.exe换IronPythonConsole.exe 就可以大功告成了,然而事实证明我的想法是很愚蠢的。尽管IronPythonConsole与cmd同为可执行文件,但是它们与作为输入输出的RichTextBox之间的关系是不同的。对cmd而言,是一种顺序的处理方式:TextBox接受用户输入-> 用户按下Enter触发相应的EventHandler,在EventHandler中创建Process以运行cmd.exe -> 将结果返回至TextBox。在这个过程中,每一条指令的输入都会相应地创建新的Process,而这个Process的life cycle仅仅存在于用户按下Enter触发的事件响应函数中;反观IronPythonConsole的情况就不是这样的了,我们需要的是一个GUI Thread来响应用户的输入,同时需要一个Worker Thread调用IronPythonConsole来完成用户输入并给出相应的输出,很明显我需要进行多线程的开发了。面对着多线程,我真的很困窘,因为自己在这个方面的经验几乎为零。不过没有办法,为了FantasyPython,只能明知山有虎,偏向虎山行了。
        也许是自己天性愚钝吧,看了两天的文章,也还没有很好的solution,不过对于Multithreading倒是有了一点小小的认识,谨记于此。首先是使用多线程的重要性了。这点其实不必多言,大家都会知道把占用大量CPU周期的数据处理放到GUI Thread中,造成GUI无法响应用户的操作是一种十分糟糕的做法。为了实现更好的用户体验,就应该创建新的进程来处理持续时间较长的操作,通常我们会把负责非UI操作的进程称为Worker Thread(工作进程)。重要性说完了,让我们关注到更具体的多线程实现上来。
        在.NET中进行多线程开发,会有很多选择,其中最常见的就是使用Control.Invoke方法了。Invoke方法提供了一种在Worker Thread调用GUI Thread中delegate的途径。同时结合Control.InvokeRequired的属性,我们也可以轻易地判断某个线程是否为创建该Control的线程。为了对Invoke方法有更深入的认识,我仔细地阅读了CodeProject上《Worker Threads In C#》一文[1]。在文中有这样的代码:
m_form.Invoke(m_form.m_DelegateAddString, new Object[] {s});

这里给出了Invoke方法的一种使用方式,但是可惜的是,我并不能对其使用的必要性有充分的理解。因为我把这段代码改为m_form.AddString(s),并且将AddString方法的access modifier由private改为public,程序仍然是运行好好的。那么Invoke方法的意义在于什么呢?而MSDN给Invoke方法下的定义又是如此的简单:Executes the specified delegate on the thread that owns the control's underlying window handle. 真的是看不明白了,烦请各位朋友不吝赐教。
        问题虽然有,但是认识还得接着说。多线程开发很重要的一点就是线程间的通信问题,在CodeProject的这篇文章中,Worker Thread与GUI Thread是通过ManualResetEvent来实现的。我们从文中的代码:
// Worker Thread
if ( m_EventStop.WaitOne(0true) ) {
    m_EventStopped.Set();
    
return;
}


// GUI Thread
if ( m_WorkerThread != null  &&  m_WorkerThread.IsAlive ) {
    m_EventStopThread.Set();
    
while (m_WorkerThread.IsAlive) {
        
if ( WaitHandle.WaitAll((new ManualResetEvent[] {m_EventThreadStopped}), 100,true) ) {
            
break;
        }


        Application.DoEvents();
    }

}

  
可以看到Worker Thread与GUI Thread之间的通信过程:
        1、当Worker Thread处于活动状态,而GUI Thread通过设置m_EventStopThread的状态向Worker Thread发出Signal,并使自己进入循环等待状态,直至接收到由Worker Thread发出的Signal;
        2、Worker Thread在接收到该Signal之后采取相应的操作,例子中的操作就是通过设置m_EventStopped的状态向GUI Thread发出自己已经停止的Signal并且返回;
        3、GUI Thread接收到来自Worker Thread发出的Signal后,跳出循环;
        呼,终于说完了。由于自己刚刚开始接触C#的MultiThreading开发,疏漏一定不少。请各位路过的朋友不要错过扔砖头的机会哦,^_^

        [1] 小新0574为这篇不错的文章提供了译文,有兴趣的朋友可以参考一下中文版。
分享到:
评论

相关推荐

    .net线程、事件资料学习包

    `.NET多线程使用初探`这篇文档可能涵盖了如何在.NET环境中创建和管理线程的基本概念,包括线程的启动、同步、互斥锁以及线程池的使用。线程池是一种优化线程管理的方式,它能有效地复用线程,减少系统开销。理解线程...

    初探c#初探c#初探c#初探c#初探c#初探c#

    .NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。 即使你没有编写多线程应用程序的经验,也可能听说过“启动线程”“杀死...

    亮剑.NET深入体验与实战精要2

    4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 ...

    用.net编写的未完善棋盘

    通过此项目,学习者可以深入理解.NET框架的基础知识,包括面向对象编程、UI设计、事件驱动编程、数据结构的应用以及多线程编程等。同时,也能锻炼解决问题和优化代码的能力,为今后的.NET开发奠定坚实基础。 总结来...

    亮剑.NET深入体验与实战精要3

    4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 ...

    .net fra ppt

    ### .NET Framework的发展历程 #### 一、引言 .NET Framework自问世以来一直是...随着.NET Framework的不断发展,未来的.NET Framework将继续引领软件开发领域的创新,为开发者提供更多高效便捷的工具和技术支持。

    paint.net.4.2.10_C#_paint.net.4.2.10_反编译后修改_源码(不完整).zip

    此外,源码可能还揭示了Paint.NET如何利用多线程和异步编程来提升性能,尤其是在处理大型图像时。 对于开发者来说,深入理解这些源码有助于提升自己的编程技巧,尤其是对于图像处理和图形用户界面的设计。通过研究...

    COM初学者体会技术初探

    6. **线程模型**:COM组件可以有多种线程模型,如单线程 apartment (STA)、多线程 apartment (MTA) 或自由线程 (Free Threaded)。选择合适的线程模型对于避免线程同步问题至关重要。 7. **自动化**:COM自动化允许...

    C# 入门初探.

    C# 是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序、Web应用程序以及游戏等。...随着对C#的深入学习,你将掌握更多高级特性和编程技巧,例如面向对象编程、异常处理、集合、多线程等。

    IPScan.zip

    《C#实现TCP端口扫描:单线程与多线程初探》 TCP端口扫描是网络管理员和开发者常用的一种技术,用于检测目标主机上哪些端口处于开放状态。在本文中,我们将深入探讨一个基于C#的TCP端口扫描程序的实现,特别是其单...

    C_网络编程初探C_网络编程初探

    ### C网络编程初探:深入理解C#网络编程的核心概念与实践 在探索C#网络编程的世界里,首要任务是理解其与C++等其他语言的显著差异——C#依赖于.NET Framework SDK作为其核心类库,特别是针对网络编程部分,系统提供...

    C#超酷教程

    例如,“腾讯社区:初探c#--12,13,14.htm”可能包含更复杂的应用示例,如多线程、网络编程或数据库操作。 通过这个系列的教程,初学者可以系统地学习C#编程,从基础语法到高级特性,逐步建立起对C#编程的全面理解。...

    C#基础系列:异步编程初探async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友说到了async, await等新语法。确实,没有异步的多线程是单调的、乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便...

    c#写的后台管理程序

    7. **多线程**:对于处理大量并发请求的后台程序,多线程技术能提升性能。C#提供了线程池、异步编程模型(如async/await)等工具,帮助开发者有效管理并发任务。 8. **日志记录**:为了追踪程序运行状态和故障排查...

    c#做的一个QQ程序,还有不足的地方...适合菜鸟下载下去消化,老鸟不要笑

    总的来说,"MyQQ"项目是一个综合运用C#语言和.NET框架的实践平台,涵盖了面向对象编程、事件驱动、多线程、网络通信、数据库操作等多个核心知识点。对于初学者来说,这是一个很好的学习起点,通过分析和改进这个项目...

    socke编程初级教程

    理解了基本的Socket编程后,你可以进一步学习多线程处理客户端请求、异步I/O(NIO)、SSL/TLS加密通信以及WebSocket等高级主题。这些将帮助你构建更复杂、更安全、更高效的网络应用。 总之,Socket编程是网络编程的...

    C#车牌识别系统.rar

    此外,该项目的源代码不复杂,这意味着初学者可以在较短时间内掌握其核心思想,并在此基础上进行二次开发,比如增加多线程处理,提高识别效率,或者结合AI模型提升识别准确率。 总的来说,“C#车牌识别系统”是一个...

    网络电台精灵

    这涉及到HTTP协议、流媒体技术和多线程编程,确保视频流畅播放且不影响用户界面的响应速度。 在实现网络电视功能时,开发者可能使用了某种标准的流媒体格式,如MPEG-DASH或HLS(HTTP Live Streaming),这些格式...

Global site tag (gtag.js) - Google Analytics