相关疑难解决方法(0)

"await Task.Run(); return;"之间的任何区别 并"返回Task.Run()"?

以下两段代码之间是否存在任何概念差异:

async Task TestAsync() 
{
    await Task.Run(() => DoSomeWork());
}
Run Code Online (Sandbox Code Playgroud)

Task TestAsync() 
{
    return Task.Run(() => DoSomeWork());
}
Run Code Online (Sandbox Code Playgroud)

生成的代码也不同吗?

编辑:为避免混淆Task.Run,类似的情况:

async Task TestAsync() 
{
    await Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

Task TestAsync() 
{
    return Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

最新更新:除了接受的答案之外,LocalCallContext处理方式也有所不同:即使没有异步,CallContext.LogicalGetData也会被恢复.为什么?

c# async-await

77
推荐指数
4
解决办法
3万
查看次数

为什么async关键字在编译时生成枚举器和附加结构?

如果我创建一个如下所示的简单类:

public class TestClass
{
    public Task TestMethod(int someParameter)
    {
        return Task.FromResult(someParameter);
    }

    public async Task TestMethod(bool someParameter)
    {
        await Task.FromResult(someParameter);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且在NDepend中检查它,它表明TestMethod采用bool并且async Task有一个为它生成的结构,包括枚举器,枚举器状态机和一些额外的东西.

在此输入图像描述

为什么编译器生成一个TestClass+<TestMethod>d__0用异步方法的枚举器调用的结构?

它似乎比实际方法产生更多的IL.在这个例子中,编译器为我的类生成35行IL,同时为结构生成81行IL.它还增加了编译代码的复杂性,并导致NDepend为几个规则违规标记它.

c# compiler-construction asynchronous ndepend

11
推荐指数
1
解决办法
405
查看次数