Task.Run( () MethodName()) 并等待 Task.Run(async () => MethodName())
Task.Run( () MethodName()) and await Task.Run(async () => MethodName())
我正在尝试了解是否使用
await Task.Run(async () => MethodName())
在 MVC 5 中提供了释放长 运行 IO 操作线程的好处,同时继续并行执行其他代码任务。
我知道简单地使用 "await MethodName()" 将释放线程,但它不会移动到下一行代码单元 MethodName() 已完成执行。 (如有错误请指正)
我希望能够在执行异步操作时释放线程,并并行执行其他代码。我想使用它来并行调用不同的数据源。这就是 "await Task.Run(async () => MethodName())" 的成就吗?
不,不要那样做。
相反,不要等待,直到你不得不等待。所以与其做
await MethodName();
DoSomeOtherWork();
做
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 个任务同时发生,而不会占用任何线程。
您可以将生成的任务存储在某个变量中并稍后等待。即:
var task = LongRunningMethodAsync();
SomeOtherWork();
SomeWorkOtherThanBefore();
awai task;
您还可以存储许多方法的结果任务并等待所有这些任务:
var tasks = new Task[] {
FirstMethodAsync(),
SecondMethodAsync(),
ThirdMethodAsync()
};
await Task.WhenAll(tasks);
我正在尝试了解是否使用
await Task.Run(async () => MethodName())
在 MVC 5 中提供了释放长 运行 IO 操作线程的好处,同时继续并行执行其他代码任务。
我知道简单地使用 "await MethodName()" 将释放线程,但它不会移动到下一行代码单元 MethodName() 已完成执行。 (如有错误请指正)
我希望能够在执行异步操作时释放线程,并并行执行其他代码。我想使用它来并行调用不同的数据源。这就是 "await Task.Run(async () => MethodName())" 的成就吗?
不,不要那样做。
相反,不要等待,直到你不得不等待。所以与其做
await MethodName();
DoSomeOtherWork();
做
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 个任务同时发生,而不会占用任何线程。
您可以将生成的任务存储在某个变量中并稍后等待。即:
var task = LongRunningMethodAsync();
SomeOtherWork();
SomeWorkOtherThanBefore();
awai task;
您还可以存储许多方法的结果任务并等待所有这些任务:
var tasks = new Task[] {
FirstMethodAsync(),
SecondMethodAsync(),
ThirdMethodAsync()
};
await Task.WhenAll(tasks);