C# WinForm开发系列 - Thread/Delegate/Event

简介:
  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://www.cnblogs.com/peterzb/archive/2009/06/10/1500273.html,如需转载请自行联系原作者。


  • 目录
    相关文章
    |
    3月前
    |
    XML 测试技术 API
    利用C#开发ONVIF客户端和集成RTSP播放功能
    利用C#开发ONVIF客户端和集成RTSP播放功能
    1466 123
    |
    10月前
    |
    物联网 数据处理 C#
    C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
    C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
    1931 82
    |
    8月前
    |
    SQL 小程序 API
    如何运用C#.NET技术快速开发一套掌上医院系统?
    本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
    313 0
    |
    12月前
    |
    缓存 算法 安全
    精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
    精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
    391 12
    |
    12月前
    |
    Linux C# iOS开发
    开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
    开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
    320 12
    |
    开发框架 缓存 .NET
    C# 一分钟浅谈:Blazor Server 端开发
    Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
    838 1
    |
    3月前
    |
    XML 前端开发 C#
    C#编程实践:解析HTML文档并执行元素匹配
    通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
    213 19
    |
    4月前
    |
    监控 算法 C#
    C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
    C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
    615 0
    |
    C# 开发者
    C# 一分钟浅谈:Code Contracts 与契约编程
    【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
    268 3
    |
    12月前
    |
    存储 安全 编译器
    学懂C#编程:属性(Property)的概念定义及使用详解
    通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
    875 12