C# 正确使用ParallelOptions、TaskCreationOptions和Task.Factory.StartNew?
请建议哪种方法是正确的(如果有的话)和正确的 高效使用ParallelOptions、TaskCreationOptions和 Task.Factory.StartNew(()=>)C# 正确使用ParallelOptions、TaskCreationOptions和Task.Factory.StartNew?,c#,task-parallel-library,C#,Task Parallel Library,请建议哪种方法是正确的(如果有的话)和正确的 高效使用ParallelOptions、TaskCreationOptions和 Task.Factory.StartNew(()=>) 目前我没有收到任何错误。第一个和第二个方法没有考虑我需要使用的MaxDegreeOfParallelism。理想情况下,我不会使用Parallel.Invoke,但如何在Task.Factory.StartNew中包含parOpts.MaxDegreeOfParallelism?您的代码和问题没有多大意义。Task
目前我没有收到任何错误。第一个和第二个方法没有考虑我需要使用的MaxDegreeOfParallelism。理想情况下,我不会使用Parallel.Invoke,但如何在Task.Factory.StartNew中包含parOpts.MaxDegreeOfParallelism?您的代码和问题没有多大意义。
Task.Factory.StartNew()
不接受MaxDegreeOfParallelism
,因为它执行单个操作。Parallel.Invoke()
接受该参数,但在执行单个操作时使用该方法没有任何意义
我认为你不应该问这样一个非常具体的问题,你应该退后一步,看看你到底在努力实现什么,然后可能会问一个新的问题
编辑:现在我想我终于明白了您要做的事情:在每个核心上,您希望执行一个单独的循环。为此,您可以使用Parallel.for()
:
如果可能的话,我需要在所有内核上并行执行LongRunningMethod()。
private void NeedToUse_MaxDegreeOfParallelism_Method1()
{
CancellationTokenSource tokenFor_task = new CancellationTokenSource();
ParallelOptions parOpts = new ParallelOptions();
//parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token;
parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount;
//parOpts.TaskScheduler = TaskScheduler.Default;
TaskCreationOptions tco = new TaskCreationOptions();
tco = TaskCreationOptions.PreferFairness;
Task task = null;
task = Task.Factory.StartNew(() =>
{
while (!tokenFor_task.IsCancellationRequested)
{
LongRunningMethod();
}
}, tokenFor_task.Token, tco, TaskScheduler.Default);
}
private void NeedToUse_MaxDegreeOfParallelism_Method2()
{
//CancellationTokenSource tokenFor_task = new CancellationTokenSource();
ParallelOptions parOpts = new ParallelOptions();
parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token;
parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount;
parOpts.TaskScheduler = TaskScheduler.Default;
TaskCreationOptions tco = new TaskCreationOptions();
tco = TaskCreationOptions.PreferFairness;
Task task = null;
task = Task.Factory.StartNew(() =>
{
while (!parOpts.CancellationToken.IsCancellationRequested)
{
LongRunningMethod();
}
}, parOpts.CancellationToken, tco, parOpts.TaskScheduler);
}
private void NeedToUse_MaxDegreeOfParallelism_Method3()
{
CancellationTokenSource tokenFor_task = new CancellationTokenSource();
ParallelOptions parOpts = new ParallelOptions();
//parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token;
parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount;
//parOpts.TaskScheduler = TaskScheduler.Default;
TaskCreationOptions tco = new TaskCreationOptions();
tco = TaskCreationOptions.PreferFairness;
Task task = null;
task = Task.Factory.StartNew(() =>
{
Parallel.Invoke(parOpts, () =>
//while is already in LongRunningMethod() because can not be here
//while (!tokenFor_task.IsCancellationRequested)
//{
LongRunningMethod()
//}
);
}, tokenFor_task.Token, tco, TaskScheduler.Default);
}
private void NeedToUse_MaxDegreeOfParallelism_Method4()
{
CancellationTokenSource tokenFor_task = new CancellationTokenSource();
ParallelOptions parOpts = new ParallelOptions();
//parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token;
parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount;
//parOpts.TaskScheduler = TaskScheduler.Default;
TaskCreationOptions tco = new TaskCreationOptions();
tco = TaskCreationOptions.PreferFairness;
Task task = null;
Parallel.Invoke(parOpts, () =>
task = Task.Factory.StartNew(() =>
{
while (!tokenFor_task.IsCancellationRequested)
{
LongRunningMethod();
}
}, tokenFor_task.Token, tco, TaskScheduler.Default)
);
}
Parallel.For(0, Environment.ProcessorCount, parOpts, () =>
{
while (!tokenFor_task.IsCancellationRequested)
{
LongRunningMethod();
}
});