C#新手求助:这段同步调用异步方法的代码逻辑是什么?
这段C#代码的执行逻辑拆解
先把代码还原为更易读的格式:
public List<InboundPlanSummary> GetListInboundPlans(ParameterGetListInboundPlans parameterGetListInboundPlans) => Task.Run(() => GetListInboundPlansAsync(parameterGetListInboundPlans)) .ConfigureAwait(false) .GetAwaiter() .GetResult();
核心作用
这是一个同步包装方法——它本身是同步返回结果的,但内部调用了异步方法GetListInboundPlansAsync,目的是把异步操作强制转为同步执行。
逐段解析
Task.Run(() => GetListInboundPlansAsync(parameterGetListInboundPlans)):
把异步方法的执行逻辑包装到一个新的Task中,交给线程池线程去执行,暂时避免阻塞当前线程(但后续代码又会把当前线程阻塞住)。.ConfigureAwait(false):
告诉Task,后续等待完成后不需要回到原来的上下文(比如UI线程、ASP.NET请求上下文),减少上下文切换的开销,同时降低死锁的可能性。.GetAwaiter().GetResult():
阻塞当前线程,等待前面的Task执行完成,然后获取异步方法的返回结果。和直接用.Result不同的是,这个方式会抛出异步方法的原始异常(而非包装在AggregateException里),调试起来更直接。
注意点
这种写法不推荐:强行把异步方法同步化很容易引发死锁(比如在UI线程或老版本ASP.NET环境中),而且违背了异步编程的设计初衷。正确的做法是让整个调用链异步化——把这个方法改成异步方法,用async/await语法实现:
public async Task<List<InboundPlanSummary>> GetListInboundPlansAsync(ParameterGetListInboundPlans parameterGetListInboundPlans) { return await GetListInboundPlansAsync(parameterGetListInboundPlans).ConfigureAwait(false); }
然后让调用方使用await来调用这个异步方法,保持异步流程的一致性。
内容的提问来源于stack exchange,提问作者garply
相关产品推荐
相关产品推荐

