【问题标题】:return Task.Run in an async method以异步方法返回 Task.Run
【发布时间】:2019-03-28 17:35:17
【问题描述】:

您将如何重写TaskOfTResult_MethodAsync 以避免错误:由于这是一个异步方法,返回表达式必须是int 类型而不是Task<int>。

private static async Task<int> TaskOfTResult_MethodAsync()
{
    return Task.Run(() => ComplexCalculation());
}

private static int ComplexCalculation()
{
    double x = 2;
    for (int i = 1; i< 10000000; i++)
    {
        x += Math.Sqrt(x) / i;
    }
    return (int)x;
}

【问题讨论】:

标签: c# async-await


【解决方案1】:

简单;要么不做async:

private static Task<int> TaskOfTResult_MethodAsync()
{
    return Task.Run(() => ComplexCalculation());
}

或await结果:

private static async Task<int> TaskOfTResult_MethodAsync()
{
    return await Task.Run(() => ComplexCalculation());
}

(在此处添加await 就生成的机器而言更昂贵,但具有更明显/可靠的异常处理等)

注意:你也可以使用Task.Yield:

private static async Task<int> TaskOfTResult_MethodAsync()
{
    await Task.Yield();
    return ComplexCalculation();
}

(请注意,这在很大程度上取决于同步上下文,如果有的话)

【讨论】:

  • 异常处理在什么方面更明显/可靠?当我测试它时,它们是相同的(除了await 版本在堆栈跟踪中有更多行。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2013-05-03
  • 2012-12-20
  • 2014-10-22
  • 2018-06-10
相关资源
最近更新 更多