C# .NET多线程有线程限制的后台进程?
我对并行编程比较陌生,需要在不同的线程上运行后台进程 这个场景是这样的-一些东西会导致第一个后台进程运行-它可能需要45秒(例如)才能完成。同时,在第一个后台进程运行后的某个任意点上,会发生另一个事件,从而导致第二个后台进程运行,例如20秒。我不想再等待25秒来完成第一个进程,我想让第二个进程立即在另一个线程上运行。但是,我还想限制可以丢弃的线程的数量C# .NET多线程有线程限制的后台进程?,c#,.net,C#,.net,我对并行编程比较陌生,需要在不同的线程上运行后台进程 这个场景是这样的-一些东西会导致第一个后台进程运行-它可能需要45秒(例如)才能完成。同时,在第一个后台进程运行后的某个任意点上,会发生另一个事件,从而导致第二个后台进程运行,例如20秒。我不想再等待25秒来完成第一个进程,我想让第二个进程立即在另一个线程上运行。但是,我还想限制可以丢弃的线程的数量 我是否需要使用BackgroundWorker对象或类似对象创建某种队列类?对于这种情况,最好的方法是什么?您最好的选择可能是使用任务并行库来完
我是否需要使用BackgroundWorker对象或类似对象创建某种队列类?对于这种情况,最好的方法是什么?您最好的选择可能是使用任务并行库来完成这项任务。您可以使用Task.run()或类似的方法启动新任务,而不是旋转线程来运行任务 任务并行库使用TaskScheduler在线程池上执行任务。TaskScheduler尝试优化线程池中的线程数以提高吞吐量。由于TaskSchedule在任务之间重用线程,因此不太可能需要限制线程池中的线程数 有关TaskScheduler的详细信息,请参阅:
如果确定需要限制线程数量,可以扩展TaskScheduler类:注意,线程池是专门为短期操作设计的;某些运行需要45秒的任务确实不应放入线程池。对于您知道需要很长时间的任务,可以使用TaskCreationOptions.LongRunning标志()通知TaskScheduler不要因为该任务而增加线程池中的线程数。在我的经验中,虽然我可能不认为45秒是一个长时间运行的任务,特别是如果这是您的任务需要花费多长时间的上限。当前的实现将创建一个新的线程,而不是使用线程池,当指定了<代码> LongRunning < /代码>选项时。(当然,这可能会发生变化。)其想法是,对于较短的任务,创建新线程的开销比任务本身要大,因此大大降低了吞吐量。在这种情况下,虽然20-45秒的任务比创建新线程所花费的时间要长得多,因此这不是一个特别大的开销,因此不使用线程池是可以的。