我有一个方法,做2 * 独立 * 逻辑片。我希望我可以运行他们两个 * 在同一时间 *...只有当这两个子方法都完成后才继续。
我试着理解async/await
的语法,但我就是不明白。
下面是代码:
public PewPew SomeMethod(Foo foo)
{
var cats = GetAllTheCats(foo);
var food = GetAllTheFood(foo);
return new PewPew
{
Cats = cats,
Food = food
};
}
private IList<Cat> GetAllTheCats(Foo foo)
{
// Do stuff, like hit the Db, spin around, dance, jump, etc...
// It all takes some time.
return cats;
}
private IList<Food> GetAllTheFood(Foo foo)
{
// Do more stuff, like hit the Db, nom nom noms...
// It all takes some time.
return food;
}
对于上面的代码,我想说:去把所有的猫和食物同时拿来。一旦我们完成了,就返回一个新的PewPew
。
我很困惑,因为我不确定上面的哪些类是async
或返回Task
,等等。所有的类?只有两个私有的类?我还猜测我需要利用Task.WaitAll(tasks)
方法,但我不确定如何 * 设置 * 任务同时运行。
有什么建议吗,好心的朋友?
5条答案
按热度按时间mccptt671#
以下是您可能需要执行的操作:
这里有两件事你需要明白:
1.这两者之间的区别是什么:
var cats =等待c任务;变量food =等待fTask;
还有这个
这两种方法都将产生类似的结果,即先完成2个
async
任务,然后再完成return new PewPew
-但是,不同之处在于Task.WaitAll()
将阻塞当前线程(如果是UI线程,则UI将冻结)。相反,await
将在状态机中分解SomeMethod
,并在遇到await
关键字时从SomeMethod
返回到其调用方。它不会阻塞线程。await
下面的代码将被安排在async
任务结束时运行。1.您还可以执行以下操作:
var cats =等待任务运行(()=〉获取所有猫(foo)); var food =等待任务.运行(()=〉获取所有食物(foo));
但是,这不会同时启动
async
任务。第二个任务将在第一个任务结束后启动。这是因为await
关键字的工作原理。编辑:如何使用
SomeMethod
-在调用树的开始,你必须使用Wait()
或Result
属性-或者-你必须从async void
到await
。通常,async void
是一个事件处理程序:如果没有,则使用
Result
属性。6ljaweal2#
到目前为止,最简单的方法是使用
Parallel.Invoke()
Parallel.Invoke()
将等待所有方法返回,然后再返回。更多信息请访问:http://msdn.microsoft.com/en-us/library/dd460705.aspx
请注意,
Parallel.Invoke()
处理系统中处理器数量的扩展,但只有当您启动的不仅仅是几个任务时,这才真正重要。7cjasjjr3#
如果您没有使用异步方法或者您使用的是旧版本的.Net framework,则不必使用异步。为简单起见,只需使用Tasks:
hm2xizp94#
您可以使用TPL来等待多个正在运行的任务。请参阅here。
就像这样:
rqqzpn5f5#
再加上其他的答案,你可以这样做: