首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task.RunSynchronously()“递归”工作吗?

Task.RunSynchronously()“递归”工作吗?
EN

Stack Overflow用户
提问于 2013-04-17 07:50:47
回答 3查看 2.1K关注 0票数 2

如果我在RunSynchronously()中的Task上调用了C#,这会导致更深入兔子洞的异步调用也会同步运行吗?

假设我有一个名为UpdateAsync()的方法。在这个方法中,对DoSomethingAsync()进行了另一个异步调用,在这个方法中我们再次找到了DoSomethingElseAsync(),将在'UpdateAsync()‘上调用RunSynchronously(),导致RunSynchronously()也间接地在DoSomethingAsync()上被调用

问题的原因:--我遇到了“需要”在catch-block中调用异步方法(UpdateAsync())的情况,并且不知道用RunSynchronously()调用这个方法是否安全。文档非常清楚地说明了这样一个事实,即您不能在一个await catch-block中使用它。(严格地说,我可以在catch-block中使用一个布尔值,并在尝试捕获之后调用UpdateAsync(),但这感觉很脏)。关于这个双重问题,我很抱歉,但你可能会理解,我不太懂怎么表达它,而且对这个领域还没有很好的理解。

(编辑:,我不知道如何找出方法是否被异步调用。你将如何为这个编写单元测试?(是否有可能以某种方式记录它?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-17 11:12:34

我“需要”调用一个异步方法,并想知道用RunSynchronously()调用这个方法是否安全。

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

而通过调用Start()RunSynchronously()可以启动的惟一的RunSynchronously()是未启动的基于代码的Task__s,因为异步方法返回承诺样式的Task(或者可能已经启动了基于代码的Task),因此对它们调用RunSynchronously()是无效的,并将导致异常。

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

*这不是正式名称,我不知道是否有。

票数 6
EN

Stack Overflow用户

发布于 2013-04-17 08:17:09

如果没有代码,很难预测它将如何执行嵌套异步方法。

您可以登录每个异步方法Thread.CurrentThread.ManagedThreadId属性,并将id与所拥有的其他线程id进行比较。当它们发生变化时,则异步方法处于多线程执行状态。

或者尝试使用Visualizer中的并发可视化器,分析菜单。使用Task类实例,甚至使用C#5异步语法,都无法知道您是在并行执行还是在另一个线程中执行。

票数 0
EN

Stack Overflow用户

发布于 2013-04-17 19:31:14

我想我会反驳@Svick的答案,但我觉得OP问题是有效的,因为可以获得异步方法的“答应”(使用Svick的术语)任务,但不能启动,从而允许执行Task.RunSynchronously()

代码语言:javascript
复制
    static void Main(string[] args)
    {
        ...
        //obtain a Task that's not started
        var t = new Task<int>((ob) => GetIntAsync((string)ob).Result, someString);
        ...
    }

    static async Task<int> GetIntAsync(string callerThreadId)
    {
       ...

尽管如此,答案是:不,RunSynchronously()会影响您所运行的任务。如果调用链稍后包含更多异步调用,则它们异步运行。

我有一个小型控制台应用程序正在对此建模,有人对此很感兴趣,但这个概念很容易再现--只需链接足够多的异步调用,并在同步和异步运行最早的调用之间切换以查看不同的行为。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16054467

复制
相关文章

相似问题

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