首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task.Run( () MethodName () )和等待Task.Run(异步() => MethodName())

Task.Run( () MethodName () )和等待Task.Run(异步() => MethodName())
EN

Stack Overflow用户
提问于 2015-03-11 21:48:30
回答 2查看 815关注 0票数 0

我试着理解如果使用

代码语言:javascript
复制
await Task.Run(async () => MethodName())

在MVC 5中,可以释放长时间运行的IO操作的线程,同时并行地继续执行其他代码任务。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-11 21:56:26

不,别那么做。

相反,不要等待直到你不得不这样做。所以不要做

代码语言:javascript
复制
await MethodName();
DoSomeOtherWork();

代码语言:javascript
复制
Task yourTask = MethodName();
DoSomeOtherWork();
await yourTask;

这使得后台IO工作和DoSomeOtherWork()同时进行,而不需要绑定线程。

如果要执行多个IO任务,则可以将它们与Task.WhenAll组合在一起。

代码语言:javascript
复制
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项任务都可以同时进行,而不需要绑定任何线程。

票数 2
EN

Stack Overflow用户

发布于 2015-03-11 21:58:51

您可以将结果任务存储在某个变量中,并在稍后等待它。Ie:

代码语言:javascript
复制
var task = LongRunningMethodAsync();

SomeOtherWork();
SomeWorkOtherThanBefore();

awai task;

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

代码语言:javascript
复制
var tasks = new Task[] {
   FirstMethodAsync(),
   SecondMethodAsync(),
   ThirdMethodAsync()
};

await Task.WhenAll(tasks);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28998046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档