c# - 消毒异步方法c#的最佳方法
问题描述
在花了太多时间试图解决异步/等待地狱之后,我们试图获得一个标准,当我们必须在我们无法控制的库上调用异步方法并且没有提供非异步方法时,以及一起从我们的代码中获取异步。
我不想讨论这个的优点我敢肯定,对于某些人来说 async/await 工作,只是调用任何异步方法并且不会出现死锁等的万无一失的方法。
做
public someObject SomeFunction(string parameter)
{
return Task.Run(() => 3rdPartyLib.SomeFunctionAsync(parameter)).Result;
}
和
public void SomeMethod()
{
return Task.Run(() => 3rdPartyLib.SomeMethodAsync()).Wait;
}
做这份工作?我需要配置等待(假)吗?异常会正常工作吗?
解决方案
好吧,为异步方法编写同步包装器也是一种反模式。
也就是说,我的 Brownfield Async 文章中涵盖了各种 hack。除非第三方库需要使用当前上下文,否则您建议的那个 - “线程池黑客” - 将起作用。例如,如果它是一个希望在可以访问 UI 控件的场景中运行的方法,或者如果它希望拥有HttpContext.Current
. 大多数图书馆不需要这个,所以这个 hack 对他们有用。
没有任何黑客可以在所有场景中无处不在。
你不需要ConfigureAwait(false)
。没有await
配置。
对于例外情况,您应该使用GetAwaiter().GetResult()
代替Result
and Wait()
。这可以防止异常被包裹在AggregateException
.
推荐阅读
- symfony - Symfony,集合,多个实体,得到arrayCollection,需要实体
- ios - 如何使用 SwiftLint 排除 Pod 警告
- .net - ASP.NET Web 表单中的内存不足异常
- python - 如何从熊猫系列中获得价值
- jquery - 当我单击我选择的最后一张图片时,我也提交了 jquery 文件上传
- python - Django IntegrityError NOT Null 约束失败 reqs_student.section_id
- java - Kafka Mirror Maker 执行地点
- ipc - 如何解决 Open VMS Web 服务集成工具包 (WSIT) 中的 IPC 错误
- c++ - c++(我的代码卡在第一个函数中)
- github-api - 我可以通过 GitHub API 添加新的分支保护规则吗?