Task.RunSynchronously()是否"递归"工作?

Hal*_*ard 2 c# asynchronous .net-4.0 async-await

如果我请RunSynchronously()一个Task在C#中,这会导致异步调用进一步下跌的兔子洞被同步运行呢?

假设我有一个名为的方法UpdateAsync().在这个方法内部进行了另一次异步调用DoSomethingAsync(),我们再次发现DoSomethingElseAsync(),调用RunSynchronously()'UpdateAsync()'导致RunSynchronously()也间接被调用DoSomethingAsync()

我的问题的原因: 我有一种情况,我"需要" UpdateAsync()catch-block中调用异步方法(),并想知道调用它RunSynchronously()是否安全.文档非常清楚,你不能awaitcatch-block中.(严格来说,我可以在catch-block中使用boolean 并UpdateAsync()在try-catch之后调用,但感觉相当脏).对于双重问题感到抱歉,但是你可能已经理解我不太清楚如何用它来表达它并且对这个领域没有很好的理解.

(编辑: 我不知道如何找出一个方法是否异步调用.你会如何为此编写一个单元测试?是否可以以某种方式记录它?)

svi*_*ick 6

我"需要"调用一个异步方法,并想知道调用它RunSynchronously()是否安全

有两种类型Task:基于代码的*Tasks(您可以使用Task构造函数创建它们Task.Factory.StartNew())和promise样式Task(您可以通过使用TaskCompletionSource或通过编写async方法手动创建它们).

唯一Task可以通过调用启动Start()或者RunSynchronously()基于代码的未启动的Tasks.由于异步方法返回promise-style Task(或者可能已经启动了基于代码的Tasks),因此调用RunSynchronously()它们无效并将导致异常.

所以,要真正回答你的问题:你所要求的是不可能的,所以询问它是否安全是没有意义的.


*这不是官方名称,我不知道是否有.