Task.Run(()MethodName())和等待Task.Run(async()=> MethodName())

时间:2015-03-11 21:48:30

标签: c# parallel-processing task

我想了解是否使用

await Task.Run(async () => MethodName())
MVC 5中的

提供了释放长时间运行的IO操作的线程的好处,同时继续并行执行其他代码任务。

我知道简单地使用“await MethodName()”将释放线程,但它不会移动到下一行代码单元MethodName()完成执行。 (如果我错了,请纠正我。)

我希望能够在异步操作执行时释放线程,以及并行执行其他代码。我想使用它来并行调用多个不同的数据源。这是“await Task.Run(async()=> MethodName())”实现的目标吗?

2 个答案:

答案 0 :(得分:2)

不,不要那样做。

相反,只是等到你必须等待。所以不要做

await MethodName();
DoSomeOtherWork();

DO

Task yourTask = MethodName();
DoSomeOtherWork();
await yourTask;

这样可以让后台IO工作同时发生,DoSomeOtherWork()同时不会占用线程。

如果要执行多个IO任务,可以将它们与Task.WhenAll

组合在一起
Task<DbOneResults> dbOne= GetDbOneRecords();
Task<DbTwoResults> dbTwo = GetDbTwoRecords();
Task<DbThreeResults> dbThree = GetDbThreeRecords();

//This line is not necessary, but if you wanted all 3 done before you 
//started to process the results you would use this. 
await Task.WhenAll(dbOne, dbTwo, dbThree);

//Use the results from the 3 tasks, its ok to await a 2nd time, it does not hurt anything.
DbOneResults dbOneResults = await dbOne;
DbTwoResults dbTwoResults = await dbTwo;
DbThreeResults dbThreeResults = await dbThree;

这可以让所有3个任务同时发生,而不会占用任何线程。

答案 1 :(得分:1)

您可以将生成的任务存储在某个变量中,稍后再等待它。即:

var task = LongRunningMethodAsync();

SomeOtherWork();
SomeWorkOtherThanBefore();

awai task;

您还可以存储许多方法的结果任务并等待所有方法:

var tasks = new Task[] {
   FirstMethodAsync(),
   SecondMethodAsync(),
   ThirdMethodAsync()
};

await Task.WhenAll(tasks);