c# – 以下Func>异步委托方法之间有什么区别?

c# – 以下Func>异步委托方法之间有什么区别?,第1张

概述如果我有以下方法: public async Task<T> DoSomethingAsync<T>(Func<Task<T>> action){ // bunch of async code..then "await action()"} 以下两种用法有什么区别: public async Task MethodOneAsync(){ return await DoSometh 如果我有以下方法:
public async Task<T> DoSomethingAsync<T>(Func<Task<T>> action){   // bunch of async code..then "await action()"}

以下两种用法有什么区别:

public async Task MethodoneAsync(){   return await DoSomethingAsync(async () => await SomeActionAsync());}public async Task MethodTwoAsync(){   return await DoSomethingAsync(() => SomeActionAsync());}

两个编译..都工作..没有R#警告……

有什么区别(如果有的话)?如果调用者等待,两个方法是否都会运行async?

解决方法 简答

MethodoneAsync()是真正的异步,应该使用,但MethodTwoAsync()不是真正的异步,因为它调用线程池线程

答案很长

出于测试和运行的目的,我已经简化了您的代码,如下所示:

从linqpad的Main方法执行如下:

var resultTask = MethodoneAsync(); // Comment one the methodsresultTask.Result.Dump();

实际代码

public async Task<int> DoSomethingAsync(Func<Task<int>> action){    return await Task.Fromresult<int>(3);}public async Task<int> MethodoneAsync(){    await Task.Delay(10);    return await DoSomethingAsync(async () => await Task.Fromresult<int>(3));}public async Task<int> MethodoneAsync(){    await Task.Delay(10);    return await DoSomethingAsync(() => Task.Fromresult<int>(3));}

现在我回顾了两次调用之间生成的IL,以下是最重要的区别:

在DoSomethingAsync中使用Async和Await进行的第一次调用具有以下IL:

<>c.<MethodoneAsync>b__2_0:IL_0000:  newobj      Userquery+<>c+<<MethodoneAsync>b__2_0>d..ctorIL_0005:  stloc.0     IL_0006:  ldloc.0     IL_0007:  ldarg.0     IL_0008:  stfld       Userquery+<>c+<<MethodoneAsync>b__2_0>d.<>4__thisIL_000D:  ldloc.0     IL_000E:  call        System.Runtime.CompilerServices.AsyncTaskMethodBuilder<system.int32>.CreateIL_0013:  stfld       Userquery+<>c+<<MethodoneAsync>b__2_0>d.<>t__builderIL_0018:  ldloc.0     IL_0019:  ldc.i4.m1   IL_001A:  stfld       Userquery+<>c+<<MethodoneAsync>b__2_0>d.<>1__stateIL_001F:  ldloc.0     IL_0020:  ldfld       Userquery+<>c+<<MethodoneAsync>b__2_0>d.<>t__builderIL_0025:  stloc.1     IL_0026:  ldloca.s    01 IL_0028:  ldloca.s    00 IL_002A:  call        System.Runtime.CompilerServices.AsyncTaskMethodBuilder<system.int32>.Start<<<MethodoneAsync>b__2_0>d>IL_002F:  ldloc.0     IL_0030:  ldflda      Userquery+<>c+<<MethodoneAsync>b__2_0>d.<>t__builderIL_0035:  call        System.Runtime.CompilerServices.AsyncTaskMethodBuilder<system.int32>.get_TaskIL_003A:  ret

没有Async和Await的第二个代码如下:

<>c.<MethodoneAsync>b__2_0:IL_0000:  ldc.i4.3    IL_0001:  call        System.Threading.Tasks.Task.Fromresult<Int32>IL_0006:  ret

除此之外,第一个具有完整的状态机代码,用于额外的异步等待调用,这是预期的.

重点:

>对于异步方法调用,请使用async()=>等待SomeActionAsync(),因为这是真正的异步执行并适用于IO完成端口
>在其他情况下,它为异步方法执行调用Threadpool线程,这对异步执行不利

如果需要了解差异,我可以粘贴完整的IL,但最好是在Visual Studio或linqPad中进行评估,以了解细微差别

总结

以上是内存溢出为你收集整理的c# – 以下Func>异步委托方法之间有什么区别?全部内容,希望文章能够帮你解决c# – 以下Func>异步委托方法之间有什么区别?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存