我在理论上理解线程,但实际上在.net中却不了解
时间:2020-03-05 18:49:23 来源:igfitidea点击:
我对多线程有基本的CS知识,但是除了在应用程序中使用简单的计时器外,从不需要做任何事情。有谁知道一个好的资源,可以带我参观如何使用多线程应用程序,解释基础知识,并可能提出一些更困难的东西?
解决方案
回答
这是约瑟夫·阿尔巴哈里(Joseph Albahari)的重要免费资源。 C#中的线程
回答
.Net中有四种同步线程的基本方法:
- BackgroundWorker控件
- WaitHandles
- 回调功能
- 轮询ASyncResult对象
通常,我们想从该列表的顶部开始,然后向下进行排序。这意味着首先查看并查看后台工作人员控件是否适合这种情况。但是,它几乎是假设Windows窗体,并且我们只产生了一个新线程。
因此,接下来尝试使用waithandles。 Waithandles非常适合将多个线程协调在一起。我们可以将它们全部踢开并等待它们完成,或者如果要保持某个数字处于活动状态,则可以仅等待其中一个,并在完成时生成下一个。或者,也许我们知道一个线程将更快完成,因此我们可以等待它完成,做一些工作,然后等待其余线程完成。
如果,例如,我们仅产生一个额外的线程,并且不想在完成之前阻塞,则Waithandles可能看起来有点多。然后,我们可以使用回调,以便线程完成后立即调用我们指定的函数。
最后,当且仅当由于某些原因上述所有方法均无效时,我们才可以使用轮询。
我可以想到5种不同的方法来在.Net中获得新线程,大致也可以这样:
- 创建操作系统,通常是由于winforms事件(包括BackgoundWorker)的结果。
- Obj.Begin ___()/ End ____()。某些CLR类已经为我们定义了这些异步方法,显然,我们希望在可用时使用它们。
- ThreadPool.QueueUserWorkItem()。大部分时间都使用此时间来创建自己的线程。
- Delegate.BeginInvoke()/ EndInvoke()。我们可以用这种方法包装任何方法。
- Thread.Start()。我们可以通过这种方式进行操作,但是最近我读到了一些内容(现在没有链接),如果QueueUserWorkItem无法正常工作,则委托方法可能更好。
回答
两篇很棒的文章:
What Every Dev Must Know About Multithreaded Apps Understand the Impact of Low-Lock Techniques in Multithreaded Apps
尽管本文并不是我们所要查找的确切文章,但希望它能对我们有所帮助(即,与之相关,并且读物非常好):
The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
回答
一个很好的Web资源,可了解.NET中的多线程:
- HTML版本。
- 可打印的版本
- 更多资源-(包括示例)
回答
我所知道的关于该主题的最佳资源之一是" C#中的线程"一书:
http://www.albahari.com/threading/
我对.net开发人员进行多线程应用程序编程需要了解的所有内容进行了很好的概述。