如何在CheckServiceResult方法中访问传入的header与AlgoNo参数?
问题描述
我有一个任务适配器方法:
public static ServiceReturnObject<T> CheckServiceResult<T>(Task<T> functionTask) { ServiceReturnObject<T> serviceReturnObject = new ServiceReturnObject<T>(); var result = functionTask.GetAwaiter().GetResult(); // ... 其他逻辑 }
我现在是这么调用它的:
CheckServiceResult(GetSomaAlgorithmResultAsync(header, AlgoNo));
GetSomaAlgorithmResultAsync是个异步函数,header和AlgoNo是我传入的参数,目前调用正常。但问题是,在CheckServiceResult方法内部,我没法直接拿到header或AlgoNo这两个参数,请问怎么才能在方法里访问它们?
解决方案
1. 直接给CheckServiceResult加参数(最直接)
修改方法签名,把需要的参数传进去就行:
public static ServiceReturnObject<T> CheckServiceResult<T>(Task<T> functionTask, object header, string algoNo) { ServiceReturnObject<T> serviceReturnObject = new ServiceReturnObject<T>(); // 这里直接用header和algoNo var result = functionTask.GetAwaiter().GetResult(); // ... 剩下的逻辑 }
调用的时候改成:
CheckServiceResult(GetSomaAlgorithmResultAsync(header, AlgoNo), header, AlgoNo);
2. 把任务和参数打包成自定义对象
如果不想改方法参数列表,可以把任务和参数封装成一个类,再传给适配器:
先定义一个包装类:
public class TaskWithParams<T> { public Task<T> Task { get; set; } public object Header { get; set; } public string AlgoNo { get; set; } }
然后修改适配器方法:
public static ServiceReturnObject<T> CheckServiceResult<T>(TaskWithParams<T> taskWrapper) { ServiceReturnObject<T> serviceReturnObject = new ServiceReturnObject<T>(); // 直接用taskWrapper.Header和taskWrapper.AlgoNo var result = taskWrapper.Task.GetAwaiter().GetResult(); // ... 其他逻辑 }
调用的时候这样写:
CheckServiceResult(new TaskWithParams<YourResultType> { Task = GetSomaAlgorithmResultAsync(header, AlgoNo), Header = header, AlgoNo = AlgoNo });
3. 用闭包捕获参数(不推荐同步阻塞场景)
如果场景允许,也可以通过闭包让适配器拿到参数,但要注意GetAwaiter().GetResult()的同步阻塞可能带来死锁风险:
先改调用方式,把参数和任务逻辑包成异步lambda:
CheckServiceResult(async () => { var result = await GetSomaAlgorithmResultAsync(header, AlgoNo); return (result, header, AlgoNo); });
然后调整适配器的泛型,接收包含结果和参数的元组:
public static ServiceReturnObject<TResult> CheckServiceResult<TResult, THeader, TAlgoNo>(Task<(TResult Result, THeader Header, TAlgoNo AlgoNo)> functionTask) { ServiceReturnObject<TResult> serviceReturnObject = new ServiceReturnObject<TResult>(); var (result, header, algoNo) = functionTask.GetAwaiter().GetResult(); // 这里可以使用header和algoNo serviceReturnObject.Data = result; // ... 其他逻辑 return serviceReturnObject; }
这种方式会增加泛型的复杂度,不如前两种方案直接直观。
内容的提问来源于stack exchange,提问作者pi511
相关产品推荐
相关产品推荐

