![](/img/trans.png)
[英]Threads can run on different processors or cores for both Task.Factory.StartNew and Parallel.Invoke
[英]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.