【发布时间】:2014-03-21 18:29:31
【问题描述】:
我正在进行异步调用的层次结构。看起来基本上是这样的:
async MyObject MainWorker()
{
return await Task.Run(SomeSynchronousFunction);
}
async MyObject InbetweenFunction1()
{
//do some things
return await MainWorker();
}
async MyObject InbetweenFunction2()
{
//do some things
return await MainWorker();
}
void ReturnObject TopFunction()
{
Task<MyObject> return1 = InbetweenFunction1();
Task<MyObject> return2 = InbetweenFunction2();
while (!return1.IsComplete || !return2.IsComplete)
Thread.Sleep(100);
//access return1.Return and return2.Return values and return from this function
}
所以我有几个级别的异步调用。顶级方法进行两次异步调用,等待它们完成(通过轮询),然后访问它们的返回值并对这些值进行处理。问题是,没有一个异步调用完成。与 Task.Run 异步调用的函数 SomeSynchronousFunction 应该最多需要几秒钟,但我等了 30 多秒并且没有结果。
这是我第一次尝试使用新的 async/await 关键字。我是不是做错了什么?
【问题讨论】:
-
什么是
MyObject?该代码甚至不应该编译,它应该是async Task<MyObject> InbetweenFunction1()(除非 MyObject 是从Task派生的某个类)。请编辑您的问题,使其成为SSCCE,否则如果我们一开始就无法理解您要做什么,将很难向您展示正确的方法。 -
除非您绝对需要您的主线程在轮询循环中阻塞,否则您可能需要在
Task.WhenAll上调用await并使用您的任务数组。 -
检查stackoverflow.com/questions/14485115/… ...旁注:按顺序等待结果会容易得多...
-
你没有指定这个的执行环境,我敢打赌它要么是WinForms,要么是WPF。 Stephen Cleary 详细解释了您所看到的僵局的性质:blog.stephencleary.com/2012/07/dont-block-on-async-code.html
-
@ScottChamberlain 即使
MyObject确实派生自Task,该代码仍然无法编译。
标签: c# .net async-await