Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET多线程有线程限制的后台进程?_C#_.net - Fatal编程技术网

C# .NET多线程有线程限制的后台进程?

C# .NET多线程有线程限制的后台进程?,c#,.net,C#,.net,我对并行编程比较陌生,需要在不同的线程上运行后台进程 这个场景是这样的-一些东西会导致第一个后台进程运行-它可能需要45秒(例如)才能完成。同时,在第一个后台进程运行后的某个任意点上,会发生另一个事件,从而导致第二个后台进程运行,例如20秒。我不想再等待25秒来完成第一个进程,我想让第二个进程立即在另一个线程上运行。但是,我还想限制可以丢弃的线程的数量 我是否需要使用BackgroundWorker对象或类似对象创建某种队列类?对于这种情况,最好的方法是什么?您最好的选择可能是使用任务并行库来完

我对并行编程比较陌生,需要在不同的线程上运行后台进程

这个场景是这样的-一些东西会导致第一个后台进程运行-它可能需要45秒(例如)才能完成。同时,在第一个后台进程运行后的某个任意点上,会发生另一个事件,从而导致第二个后台进程运行,例如20秒。我不想再等待25秒来完成第一个进程,我想让第二个进程立即在另一个线程上运行。但是,我还想限制可以丢弃的线程的数量


我是否需要使用BackgroundWorker对象或类似对象创建某种队列类?对于这种情况,最好的方法是什么?

您最好的选择可能是使用任务并行库来完成这项任务。您可以使用Task.run()或类似的方法启动新任务,而不是旋转线程来运行任务

任务并行库使用TaskScheduler在线程池上执行任务。TaskScheduler尝试优化线程池中的线程数以提高吞吐量。由于TaskSchedule在任务之间重用线程,因此不太可能需要限制线程池中的线程数

有关TaskScheduler的详细信息,请参阅:


如果确定需要限制线程数量,可以扩展TaskScheduler类:

注意,线程池是专门为短期操作设计的;某些运行需要45秒的任务确实不应放入线程池。对于您知道需要很长时间的任务,可以使用TaskCreationOptions.LongRunning标志()通知TaskScheduler不要因为该任务而增加线程池中的线程数。在我的经验中,虽然我可能不认为45秒是一个长时间运行的任务,特别是如果这是您的任务需要花费多长时间的上限。当前的实现将创建一个新的线程,而不是使用线程池,当指定了<代码> LongRunning < /代码>选项时。(当然,这可能会发生变化。)其想法是,对于较短的任务,创建新线程的开销比任务本身要大,因此大大降低了吞吐量。在这种情况下,虽然20-45秒的任务比创建新线程所花费的时间要长得多,因此这不是一个特别大的开销,因此不使用线程池是可以的。