public class PerformMainTask()
{
Task1();
Task2();
PerformLongTask();
Task3();
Task4();
}
我想在这里实现的是PerformLongTask()
到另一个线程,并继续使用Task3&任务4即使PerformLongTask()
仍在运行。
我的PerformLongTask()
应该如何以C#5.0的方式出现?
我需要使用async/await
吗?
答案 0 :(得分:3)
我所知道的最简单的解决方案是:
Task1();
Task2();
var task3 = Task.Run(() => PerformLongTask());
Task4();
Task5();
task3.Wait(); //if task3 has not started yet it will be inlined here
简单高效。如果您需要传播错误,则应该使用Parallel.Invoke
:
Parallel.Invoke(
() => { PerformLongTask(); },
() => { Task4(); Task5(); }
);
答案 1 :(得分:2)
假设您正在使用C#5并且所有Task()方法确实返回Task
(或任何等待的东西),您的代码应如下所示:
public async Task PerformMainTask()
{
await Task1();
await Task2();
// Start long task
var longTask = PerformLongTask();
await Task3();
await Task4();
//wait for long task to finish
await longTask;
}
但是,如果您的长任务不是自己并行运行,则可以使用Task.Run
强制执行此操作:
public async Task PerformMainTask()
{
await Task1();
await Task2();
// Start long task
var longTask = Task.Run(PerformLongTask);
await Task3();
await Task4();
//wait for long task to finish
await longTask;
}
如果你的任务都不是真正的任务,那么除了最后一个任务之外,只需去掉所有的等待,你就会好起来。
答案 2 :(得分:0)
public class PerformMainTask()
{
Task1();
Task2();
Task.WaitAll(Task.Factory.StartNew(() => PerformLongTask()), Task.Factory.StartNew(() => { Task3(); Task4(); }));
}