我对多线程有基本的 cs-major 理解,但除了应用程序中的简单计时器之外,我从来不需要做任何事情。有谁知道一个很好的资源可以让我了解如何使用多线程应用程序,解释基础知识并可能提出一些更困难的东西?
5 回答
这是 Joseph Albahari 提供的一个很棒的免费资源。C#中的线程
两篇很棒的文章:
尽管这篇文章并不是您具体要查找的内容,但希望总体上能有所帮助(即,它是相关的,并且非常适合阅读):
在 .Net 中同步线程有 4 种基本方法:
- BackgroundWorker 控件
- 等待句柄
- 回调函数
- 轮询 ASyncResult 对象
通常,您希望从该列表的顶部开始并向下工作。这意味着首先查看后台工作程序控件是否适合这种情况。但是,它几乎假定 Windows 窗体,并且您只产生一个新线程。
所以接下来尝试等待句柄。等待句柄非常适合将多个线程协调在一起。您可以将它们全部关闭并等待它们全部完成,或者如果您想保持某个数字处于活动状态,您可以只等待一个并在它完成时产生下一个。或者你知道一个线程会更快完成,所以你可以等待它完成,做一些工作,然后等待其余的完成。
如果您只生成一个额外的线程并且您不想在它完成之前阻塞,那么等待句柄可能看起来有点多。然后您可以使用回调,以便线程完成后立即调用您指定的函数。
最后,当且仅当由于某种原因上述方法都不起作用时,您可以退回到轮询。
我可以想到 5 种不同的方法在 .Net 中获取新线程,大致顺序也是:
- 操作系统创建,通常是 winforms 事件(包括 BackgoundWorker)的结果。
- 对象.开始___()/结束____()。某些 CLR 类已经为您定义了这些异步方法,显然您希望在它们可用时使用它们。
- 线程池.QueueUserWorkItem()。大多数时候使用它来创建自己的线程。
- 委托.BeginInvoke()/EndInvoke()。你可以用这种方式包装任何方法。
- 线程.开始()。你可以这样做,但我最近读了一些东西(现在没有链接),如果 QueueUserWorkItem 不起作用,委托方法可能会更好。
一个很好的网络资源来了解 .NET 中的多线程:
我所知道的关于该主题的最佳资源之一是“C# 中的线程”一书: http ://www.albahari.com/threading/
为了编写多线程应用程序,我对 .net 开发人员需要了解的所有内容有一个很好的概述。