如何在异步方法调用中传递异步方法委托?委托类型定义
解决异步方法委托定义的问题
这个问题其实很简单,核心就是要匹配你那两个异步方法的签名来定义委托类型就行,给你两种常用的方案:
方案1:自定义委托类型
既然你的Method_1_Async和Method_2_Async都是**接受一个string参数,返回Task
// 定义匹配异步方法签名的委托 public delegate Task<string> DelegateMethodClass(string parameter);
这样你的Method_3_Async就可以直接用这个委托类型作为参数,调用起来完全符合你预期的形式:
public async Task<string> Method_3_Async(DelegateMethodClass methodName, string parameter) { return await methodName(parameter); } // 调用示例 var result1 = await Method_3_Async(Method_1_Async, "testParam1"); var result2 = await Method_3_Async(Method_2_Async, "testParam2");
方案2:使用内置泛型委托(更推荐)
其实.NET已经为我们提供了现成的泛型委托Func<T, TResult>,完全可以替代自定义委托,不用额外写委托定义代码,更简洁。
你的异步方法签名对应Func<string, Task<string>>——第一个泛型参数是输入的string类型,第二个是返回的Task<string>类型。这样Method_3_Async可以写成:
public async Task<string> Method_3_Async(Func<string, Task<string>> methodName, string parameter) { return await methodName(parameter); } // 调用方式和上面完全一样 var result1 = await Method_3_Async(Method_1_Async, "testParam1");
为什么这两种方案都可行?
异步方法的底层本质就是返回Task或Task<T>的普通方法,所以只要委托的签名(参数类型、数量,返回值类型)和异步方法完全匹配,就可以直接把方法组作为参数传递进去,不需要额外的包装。
内容的提问来源于stack exchange,提问作者MBK
相关产品推荐
相关产品推荐

