Sir*_*ifi 1 c# asynchronous async-await c#-6.0
我读到这一篇关于富力表达成员C#6.0中,作者展示了这种代码:
public async Task<string> ReadFromWeb() => await RunWebRequest();
Run Code Online (Sandbox Code Playgroud)
他说不建议在上面的代码中使用async和await关键字:
编译器正在执行一些繁重的工作来实现此方法的异步状态机.由于该方法的结构,额外的工作并没有真正实现.它正在创建一个状态机来包装一个简单地解开从不同方法返回的任务的任务.他提议我们应该编写没有异步的代码并等待:
public Task<string> ReadFromWebSimple() => RunWebRequest();
Run Code Online (Sandbox Code Playgroud)
我想知道更多相关信息.
让我们看看作者在谈论什么.当您将方法标记为时async,编译器会代表您生成状态机,以便允许异步执行方式"感觉"它正在同步执行.
当你写:
public async Task<string> ReadFromWeb() => await RunWebRequest();
Run Code Online (Sandbox Code Playgroud)
编译器生成:
[AsyncStateMachine(typeof(C.<RunWebRequest>d__1))]
public Task<string> RunWebRequest()
{
C.<RunWebRequest>d__1 <RunWebRequest>d__;
<RunWebRequest>d__.<>t__builder = AsyncTaskMethodBuilder<string>.Create();
<RunWebRequest>d__.<>1__state = -1;
AsyncTaskMethodBuilder<string> <>t__builder = <RunWebRequest>d__.<>t__builder;
<>t__builder.Start<C.<RunWebRequest>d__1>(ref <RunWebRequest>d__);
return <RunWebRequest>d__.<>t__builder.Task;
}
Run Code Online (Sandbox Code Playgroud)
由于您使用的是Expression Bodied方法,因此您实际上只有一个方法的单线程.你await什么时候开始做什么的?当你想操纵异步方法的返回值时.对于单线,情况永远不会如此.这意味着您可以在调用级别保存状态机生成,并且只允许那些想要await将结果更高的调用者堆栈await放在您的方法上.这将有效地将您的方法转换为如下所示:
public Task<string> ReadFromWeb()
{
return this.RunWebRequest();
}
Run Code Online (Sandbox Code Playgroud)
这样可以节省相当已经非常微薄的状态机struct由编译器,它实际上是相当多余的,当你创建一个EBM分配.
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |