繁体   English   中英

C#多线程 - 使用什么方法?

[英]C# Multi-Threading - What method to use?

我的目标是编写一个程序,根据给定的用户输入处理任意数量的任务。

假设在这种情况下,任务数量为1000。

现在,我希望能够生成动态数量的线程并逐个开始处理任务。

我认为我需要使用“同步”方法,而不是“异步”方法,以便在一个任务出现问题的情况下,我不希望它减慢其余任务的完成速度。

我将用什么方法来实现上述目标? 信号灯? 线程池? 如何确保线程不会尝试启动已由另一个线程处理的任务? “锁定”会处理这个吗?

我们将非常感谢代码示例和/或指向正确方向的网站链接。

编辑: MSDN Fibonacci示例的问题是waitall方法最多只能处理64个等待。 由于1000项任务,我需要更多。 如何解决这种情况而不会造成死锁?

这些任务是独立的吗? 如果是这样,你基本上需要一个生产者/消费者队列或一个自定义线程池,它们对同一个东西实际上是不同的视图。 您需要能够将任务放入队列中,并让多个线程能够从该队列中读取。

我在MiscUtil中有一个自定义线程 池,或者在我的线程教程中有一个简单的(由于年龄而非通用)生产者/消费者队列(大约在本页的一半)。

如果这些任务合理地长时间运行,我不会使用系统线程池 - 它会产生比你想要的更多的线程。 如果您使用的是.NET 4.0 beta 1,则可以使用Parallel Extensions。

我不太确定你对WaitAll的评论......当你完成所有事情的时候,你想要解决这个问题吗? 在生产者/消费者队列的情况下,这可能涉及在队列中有某种“停止”条目(例如,消费线程理解为意味着“退出”的空引用),然后添加“WaitUntilEmpty”方法(应该相当容易实现)。 请注意,您不需要等到最后一个项目被处理 ,因为它们都是停止信号......当队列清空时,所有实际工作项目肯定都会被处理掉。

您可能希望使用ThreadPool来管理它。

我建议在MSDN上阅读如何在C#中使用ThreadPool 它涵盖了许多方面,包括触发任务和简单同步。

在C#中使用线程是主要部分,并将涵盖其他选项。

如果您碰巧使用的是VS 2010测试版,并且目标是.NET 4,那么任务并行库是一个非常好的选择 - 它简化了其中的一些模式。

你还不能使用它(但是)但是.NET 4中的新Task类对于这种情况是理想的。
在那之前,ThreadPool是你最好的选择。 它具有(非常)有限的负载平衡形式。 请注意,如果您尝试启动1000个线程,则可能会出现“内存不足”异常。 ThreadPool将轻松处理。

如果时间安排在主线程中可以容忍Sleep(1)循环,则可以使用简单(互锁)计数器处理同步问题。 ThreadPool缺少一种更方便的方法。

避免任务的简单策略是通过两个或多个线程获得同步(例如,使用mutext)向量。

请参阅此http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx

也许您可以使用BackgroundWorker类。 它在线程池之上创建了一个很好的抽象。 如果要设置许多类似的作业,甚至可以将其子类化。

如前所述,.NET 4具有出色的任务并行库。 但你可以在.NET 3.5中使用它的2008年6月的CTP就好了。 我自己一直在为一些业余爱好项目做这个,但如果这是一个商业项目,你应该检查是否存在法律问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM