繁体   English   中英

通过新的任务并行库,如何确保两个任务在不同的线程甚至不同的处理器上运行?

[英]How can I ensure two tasks are running on different threads or even different processors with the new Task Parallel Library?

我有两个长期运行的任务,它们同时从网络流中读取和写入数据,这需要我使用两个不同的线程。
我已将它们标记为可以长时间运行,但是根据将它们标记为可以长期运行的文档,它仅建议使用,但不能保证它们将在不同的线程上运行。
我需要编写自己的任务计划程序吗? 我应该改用线程池吗?

LongRunning提示它应该在新线程上执行,而不是在ThreadPool中的现有线程上执行。 这样一来,您就不会因为长时间运行的任务而耗尽ThreadPool。

无法保证无论在TPL中还是在ThreadPool中都不会使用两个不同的线程。 例如,可能是同一线程同步执行两个任务。

您是否考虑过使用异步io?

如果“网络流”表示NetworkStream类,那么我不确定您为什么真正需要两个单独的线程。 您是否基于文档中的以下引用:

“只要有一个用于写操作的唯一线程和一个用于读操作的唯一线程,读和写线程之间就不会有交叉干扰,并且不需要同步”

如果是这样,那只是一个建议-他们是说,如果您以这种方式进行操作,则无需进行任何同步。 他们之所以这么说,主要是因为NetworkStream与众不同,因为它同时支持从两个线程进行访问,只要一个线程正在读取而一个线程正在写入。

但是从文档中可以清楚地看到,您还可以选择执行同步-他们只是说,如果您选择沿着只有一个读线程和一个写线程的路径进行同步,则没有必要。

但是,如果由于某种原因您确实确实需要两个专用线程,那么...我只是使用Thread类。 试图让Task为您做到这一点(直接或通过TaskScheduler间接)可能会使事情变得更复杂。 这不会阻止您使用TaskCompletionSource您可以使用TaskCompletionSource创建任务,并TaskCompletionSource完成任务。 (对于要控制任务执行方式但仍将其作为Task对象公开的情况,TCS是正常的解决方案。)

string[] forums = File.ReadAllLines(Environment.CurrentDirectory + @"\forums.txt");

Task[] tasks = new Task[forums.Length ];
int ctr = 0;
DateTime Start = DateTime.Now;`
foreach(string s in forums)`
{
object state = s;
var task = Task.Factory.StartNew(() => DoSomeWork(state),TaskCreationOptions.LongRunning);
tasks[ctr] = task;
ctr++;
}

Task.WaitAll(tasks);
DateTime end = DateTime.Now;
TimeSpan elapsed = end - Start;
string totalMs = elapsed.TotalMilliseconds.ToString();
Console.WriteLine("DONE in " +totalMs + " ms. Any Key to quit.");
Console.ReadKey();

LongRunning枚举方法重载告诉任务库为每个任务分配一个线程,而不管它可以使用多少核。

暂无
暂无

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

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