以异步方式返回Task.Run

Jan*_*e E 1 c# async-await

如何重写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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 7

简单; 或者不要成功async:

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

await结果:

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

(await在生成的机器方面添加这里更昂贵,但有更明显/可靠的异常处理等)

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

private static async Task<int> TaskOfTResult_MethodAsync()
{
    await Task.Yield();
    return ComplexCalculation();
}
Run Code Online (Sandbox Code Playgroud)

(请注意,这取决于sync-context,如果有的话)