C#中如何为异步函数的委托参数添加参数并传递错误消息?
问题:如何给异步委托传递错误消息?
我有如下异步方法,运行完全正常:
protected async Task ProcessExecuteResponseAsync(string errorMessage, Func<Task> failureAction = null) { if (isOk == false) { if (failureAction != null) { var failureResult = failureAction.Invoke(); await failureResult; } } }
现在我想把errorMessage传递给failureAction委托,尝试了下面的写法,却报错无法将string转换为Task:
protected async Task ProcessExecuteResponseAsync(string errorMessage, Func<Task, string> failureAction = null) { if (isOk == false) { if (failureAction != null) { var failureResult = failureAction.Invoke(errorMessage); await failureResult; } } }
请问正确的语法应该是什么?
解答
你搞反了Func泛型参数的顺序:Func<T1, TResult>的规则是最后一个类型是返回值,前面的都是输入参数。你写的Func<Task, string>表示委托需要接收一个Task参数、返回string,但调用时传的是string类型的errorMessage,自然会类型不匹配报错。
正确的委托类型应该是Func<string, Task>——接收一个string参数,返回Task。修正后的方法代码如下:
protected async Task ProcessExecuteResponseAsync(string errorMessage, Func<string, Task> failureAction = null) { if (!isOk) { // 空值安全调用,避免空引用异常 await failureAction?.Invoke(errorMessage); } }
调用该方法时,你可以这样传入带错误消息参数的委托:
await ProcessExecuteResponseAsync("操作执行失败", async (errMsg) => { // 示例:用传入的错误消息做日志记录 await LogHelper.WriteErrorLogAsync(errMsg); });
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

