个人开发历程知识库

关注C++/Java/C#技术, 致力于安防监控/移动应用/WEB方面开发
------------------------------------ 业精于勤,荒于嬉;行成于思,毁于随
posts - 163, comments - 556, trackbacks - 0, articles - 18
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
     C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(可能.Net不觉得这部分是它所特有的)。那我们为什么要使用多线程? 应该什么时候使用它呢?

1.耗时的操作使用线程,提高应用程序响应

2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

3.多CPU系统中,使用线程提高CPU利用率

4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。


老赵在其文章正确使用异步操作中总结了下面几类操作使用多线程,可以提高性能,如文件操作,网络通讯,Web请求调用等:

  • FileStream操作:BeginRead、BeginWrite。调用BeginRead/BeginWrite时会发起一个异步操作,但是只有在创建FileStream时传入FileOptions.Asynchronous参数才能获取真正的IOCP支持,否则BeginXXX方法将会使用默认定义在Stream基类上的实现。Stream基类中BeginXXX方法会使用委托的BeginInvoke方法来发起异步调用——这会使用一个额外的线程来执行任务。虽然当前调用线程立即返回了,但是数据的读取或写入操作依旧占用着另一个线程(IOCP支持的异步操作时不需要线程的),因此并没有任何“节省”,反而还很有可能降低了应用程序的性能,因为额外的线程切换会造成性能损失。

  • DNS操作:BeginGetHostByName、BeginResolve。

  • Socket操作:BeginAccept、BeginConnect、BeginReceive等等。

  • WebRequest操作:BeginGetRequestStream、BeginGetResponse。

  • SqlCommand操作:BeginExecuteReader、BeginExecuteNonQuery等等。这可能是开发一个Web应用时最常用的异步操作了。如果需要在执行数据库操作时得到IOCP支持,那么需要在连接字符串中标记Asynchronous Processing为true(默认为false),否则在调用BeginXXX操作时就会抛出异常。

  • WebServcie调用操作:例如.NET 2.0或WCF生成的Web Service Proxy中的BeginXXX方法、WCF中ClientBase<TChannel>的InvokeAsync方法。

     

    CSDN愚翁专栏博客文章第一期总结之三:Thread的问题总结了下面一些问题,感觉自己在开发中都有遇到,挺不错的一篇文章

    那么线程相关的问题大致有如下四类(这篇文章只讨论单线程、单线程与UI线程这两方面的问题)。

    问题一,线程的基本操作,例如:暂停、继续、停止等;

    问题二,如何向线程传递参数或者从中得到其返回值;

    问题三,如何使线程所占用的CPU不要老是百分之百;

    最后一个,也是问题最多的,就是如何在子线程来控制UI中的控件,换句话说,就是在线程中控制窗体某些控件的显示。

    还有CSDN论坛帖子[★]WinForm中,主线程如何优雅的控制子线程?

     

    2. 园友们也有不少关于多线程的文章,收藏一下(不断更新, 慢慢补充)

     朱燚 .Net多线程总结(一)   .Net多线程总结(二)-BackgroundWorker


    把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论

    目录

     

    基础篇

    WinForm多线程编程篇

    线程池

    同步

    什么时候需要锁定

    Web和IIS

     

    没有昵称 在.Net中使用异步(一) 在.Net中使用异步(二)

    idior  Delegate比较全面的例子(原创)  异步Socket  HashTable的线程安全性

    .Net2.0 的新线程 ParameterizedThreadStart &BackgroundWorker

    wuhang 转载来的,线程的基础   转载来的WinForm多线程编程篇  依旧是转载来的Thread and Sync In C# (C#中的线程与同步)

    小y  线程和Application.DoEvents()

    BugHunter C# 中的委托  自定义线程池-c#的简单实现

    清雷 一个封装的异步Socket客户端

    牧野  .NET Socket开发之异步Socket

    Shawn.Nie C#中Socket多线程编程实例 [转载]

  • 寒蝉 [转]如何智能客户端应用程序性能

  • EricWen  C#异步编程

  • Qim C#异步数据处理及进度显示

  • today   打造迅速响应的用户界面

  • Net66  通过多线程为基于 .NET 的应用程序实现响应迅速的用户  衔接UI线程和管理后台工作线程的类(多线程、异步调用)

  • 破宝   .NET 事件模型教程(一)  .NET 事件模型教程(二)  .NET 事件模型教程(三)

  • hertcloud的专栏  原创 C# 一个多线程操作控件的例子

  • 飛雪飄寒  委托与事件——系列文章收藏 (很全面, 推荐)

    3. 其它网络资源

    C#中的多线程   在.NET客户端程序中使用多线程(一)   在C#中编写多线程应用程序

    C# 如何:对Windows 窗体控件进行线程安全调用

  • 如果你不想在网上一一浏览相关博客文章, 我手头整理了一份电子版(PDF), 可供大家学习参考, 好像有点大, 宿舍网速不行, 大家直接留言向我索取吧发邮箱.
    相关文章代码版权属于原作者, 仅供学习参考.总算上传上来了, 下载编程资料 - 多线程篇.pdf.

  • 作者:peterzb个人开发历程知识库 - 博客园
    出处:http://peterzb.cnblogs.com/
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    标签: C#, WinForm, Socket, Thread

    Feedback

    #1楼  回复 引用 查看   

    2009-06-10 13:03 by 温景良(Jason)      
    整理得不错

    #2楼[楼主]  回复 引用 查看   

    2009-06-10 13:07 by peterzb      
    @温景良(Jason)
    谢谢

    #3楼  回复 引用 查看   

    2009-06-10 23:27 by 木鱼      
    资料很多,我偷个懒向楼主索取一份了 :-)

    fishcn@foxmail.com

    THX :-)

    #4楼[楼主]  回复 引用 查看   

    2009-06-11 00:15 by peterzb      
    @木鱼
    已发你邮箱了,争取明天到公司上传上来,供有需要的人下载

    #5楼  回复 引用 查看   

    2009-06-12 17:38 by 麦子|君子兰      
    有离线版的?

    #6楼  回复 引用   

    2009-06-13 20:58 by lz6828[未注册用户]
    谢谢!!

    #7楼  回复 引用 查看   

    2009-06-14 13:55 by 一抹红      
    楼主,我也要一份,谢谢了

    #8楼[楼主]  回复 引用 查看   

    2009-06-14 14:00 by peterzb      
    @一抹红
    文章最后已经提供下载地址了, 下载编程资料 - 多线程篇.pdf.

    #9楼  回复 引用   

    2009-06-16 21:22 by DongLiYang
    整理的很好啊。

    #10楼  回复 引用 查看   

    2009-06-28 00:20 by Jack Fan      
    楼主幸苦了!不错,期望继续加油啊!

    #11楼  回复 引用   

    2009-07-14 15:07 by 努力[未注册用户]
    整理的非常不错,能否发送一份。。

    jxj31@126.com

    #12楼  回复 引用   

    2009-07-14 15:07 by 努力[未注册用户]
    整理的非常不错,能否发送一份。。

    jxj31@126.com

    #13楼  回复 引用 查看   

    2009-07-23 09:22 by itliyi      
    liyiitfuture@163.com 3Q

    #14楼  回复 引用   

    2009-07-29 14:57 by dayan[未注册用户]
    mich.meng@163.com
    谢谢LZ

    #15楼  回复 引用 查看   

    2009-08-05 22:46 by itliyi      
    楼主帮忙发到我邮箱下啦 3Q
    liyiitfuture@163.com

    #16楼  回复 引用 查看   

    2009-10-19 17:28 by 心碎冰咖啡      
    版主我也要一份~邮箱:zhangqiteng@yahoo.com.cn

    #17楼  回复 引用 查看   

    2009-10-19 17:36 by vip_hack      
    也发咱一份了,邮箱是:vip_hack_ok@163.com

    #18楼  回复 引用   

    2009-10-26 22:43 by uc_xkj[未注册用户]
    版主我也要一份~邮箱:uc_xkj@126.com

    #19楼  回复 引用 查看   

    2009-10-30 10:42 by my happy ending      
    正需要这个请给我也发一份
    hrbwgs1111@163.com
    谢谢

    #20楼  回复 引用 查看   

    2009-11-02 11:43 by Q/chen      
    版主 也给我一份 最近在做这方面的东东 希望有所帮助:
    chenquna18@163.com

    #21楼  回复 引用 查看   

    2010-01-12 10:12 by zjutsxj      
    收藏收藏

    #22楼  回复 引用 查看   

    2010-01-13 18:02 by 琳琅      
    谢谢,下载下来了,下去后好好看看

    #23楼  回复 引用 查看   

    2010-01-17 16:28 by 琳琅      
    lz 整理的很好,非常感谢。以前理解总是似懂非懂,看了了之后思路清晰些了。
    只是有一点不明白:事件委托和一般委托的区别是否就是:事件委托的返回值一定要是void啊?
    还有线程调用界面方法时也是使用委托,那时委托的返回类型是否也一定要是void型的呢?

    #24楼  回复 引用 查看   

    2010-09-01 10:20 by 南京小菜      
    谢谢楼主的分享!

    #25楼  回复 引用 查看   

    2010-11-26 19:04 by 简单就好      
    能给我发一份吗?onlykwy@qq.com

    #26楼  回复 引用 查看   

    2010-12-15 11:24 by luolei05      
    ll417189449@126.com,多线程资料!谢谢!

    #27楼[楼主]  回复 引用 查看   

    2010-12-15 14:24 by peterzb      
    @琳琅
    没有这个限制啊

    #28楼[楼主]  回复 引用 查看   

    2010-12-15 14:25 by peterzb      
    @luolei05
    @简单就好
    文章最后就有提供下载地址

    #29楼  回复 引用 查看   

    2011-02-10 18:50 by 守、望      
    谢谢,楼主分享!

    #30楼  回复 引用 查看   

    2011-02-12 16:45 by 守、望      
    楼主,文章写的真好啊,讲解的通俗易懂,十分感谢!!!楼主应该考虑下出书。

    #31楼  回复 引用 查看   

    2011-11-25 11:02 by 风中飞翔      
    你好,在网上看到你这篇文章,看后感觉很好,但文字学习不够深刻,你的文章里提供了代码下载,可惜就是下载不下来,http://www.percyboy.com/p/i/eventmodeldemo.zip无法下载

    能否提供一份,邮箱地址:zd198367@126.com