7

我对多线程有基本的 cs-major 理解,但除了应用程序中的简单计时器之外,我从来不需要做任何事情。有谁知道一个很好的资源可以让我了解如何使用多线程应用程序,解释基础知识并可能提出一些更困难的东西?

4

5 回答 5

23

这是 Joseph Albahari 提供的一个很棒的免费资源。C#中的线程

于 2008-09-08T14:59:30.037 回答
11

两篇很棒的文章:

每个开发人员必须了解的多线程应用程序
了解低锁技术在多线程应用程序中的影响

尽管这篇文章并不是您具体要查找的内容,但希望总体上能有所帮助(即,它相关的,并且非常适合阅读):

免费午餐结束:软件并发性的根本转变

于 2008-09-08T15:06:37.803 回答
5

在 .Net 中同步线程有 4 种基本方法:

  • BackgroundWorker 控件
  • 等待句柄
  • 回调函数
  • 轮询 ASyncResult 对象

通常,您希望从该列表的顶部开始并向下工作。这意味着首先查看后台工作程序控件是否适合这种情况。但是,它几乎假定 Windows 窗体,并且您只产生一个新线程。

所以接下来尝试等待句柄。等待句柄非常适合将多个线程协调在一起。您可以将它们全部关闭并等待它们全部完成,或者如果您想保持某个数字处于活动状态,您可以只等待一个并在它完成时产生下一个。或者你知道一个线程会更快完成,所以你可以等待它完成,做一些工作,然后等待其余的完成。

如果您只生成一个额外的线程并且您不想在它完成之前阻塞,那么等待句柄可能看起来有点多。然后您可以使用回调,以便线程完成后立即调用您指定的函数。

最后,当且仅当由于某种原因上述方法都不起作用时,您可以退回到轮询。

我可以想到 5 种不同的方法在 .Net 中获取新线程,大致顺序也是:

  • 操作系统创建,通常是 winforms 事件(包括 BackgoundWorker)的结果。
  • 对象.开始___()/结束____()。某些 CLR 类已经为您定义了这些异步方法,显然您希望在它们可用时使用它们。
  • 线程池.QueueUserWorkItem()。大多数时候使用它来创建自己的线程。
  • 委托.BeginInvoke()/EndInvoke()。你可以用这种方式包装任何方法。
  • 线程.开始()。你可以这样做,但我最近读了一些东西(现在没有链接),如果 QueueUserWorkItem 不起作用,委托方法可能会更好。
于 2008-09-08T15:02:55.830 回答
2

一个很好的网络资源来了解 .NET 中的多线程:

于 2008-09-08T15:09:44.300 回答
1

我所知道的关于该主题的最佳资源之一是“C# 中的线程”一书: http ://www.albahari.com/threading/

为了编写多线程应用程序,我对 .net 开发人员需要了解的所有内容有一个很好的概述。

于 2008-09-18T09:49:58.510 回答