【发布时间】:2013-04-18 04:06:43
【问题描述】:
如果我在 C# 中对 Task 调用 RunSynchronously(),这是否会导致异步调用进一步深入兔子洞以同步运行?
假设我有一个名为UpdateAsync() 的方法。在此方法中,对DoSomethingAsync() 进行了另一个异步调用,在此内部我们再次找到DoSomethingElseAsync(),将在'UpdateAsync()' 上调用RunSynchronously() 导致RunSynchronously() 也间接在DoSomethingAsync() 上被调用?
我的问题的原因:
我有一种情况,我“需要”在 catch-block 中调用异步方法 (UpdateAsync()),并想知道用 RunSynchronously() 调用它是否安全。文档非常清楚地说明您不能在catch-block 中使用await。 (严格来说,我可以在 catch-block 中使用布尔值并在 try-catch 之后调用 UpdateAsync(),但这感觉很脏)。对双重问题感到抱歉,但正如您可能理解的那样,我不太知道如何表达它并且对这个领域没有很好的理解。
(编辑: 我不知道如何找出方法是否被异步调用。您将如何为此编写单元测试?是否有可能以某种方式记录它?)
【问题讨论】:
-
如果您使用
async/await并调用async方法,您很可能不想通过调用RunSynchronously()来阻止 - 所以我会选择布尔标志选项。 -
@NicholasButler 使用这样的 bool 标志感觉就像是一种黑客行为,但在某种程度上,异步调用异步方法确实更安全。无论如何,这在我们的应用程序中只发生在一个地方。
标签: c# asynchronous .net-4.0 async-await