c# - 为什么我的 c# 测试应用程序阻塞在一个异步函数上,而不是另一个?
问题描述
我有一台设备,可以通过设备供应商提供的随附 API 库与之交互。大多数活动涉及连接到它、打开/关闭它的门以及其他一些任务。我已经将供应商的大部分同步 API 函数调用封装在 Task.Run() 中,以便在 winforms 测试应用程序中使用,以避免阻塞 UI。这主要是有效的,除非我在创建设备代理对象时使用 ConfigureAwait(false) 将阻塞的初始 Connect 调用除外。我很难理解为什么这个功能,到目前为止只有这个功能,会导致应用程序 UI 挂起,直到它完成,而其他(比如关门的那个)却没有。
SomeProxy 对象是继承自 RealProxy 的供应商 API 的一部分,但我无法访问其内部工作原理。
控制功能摘录:
private async void buttonConnect_Click(object sender, EventArgs e)
{
await Client.ConnectAsync(address);
}
private async void buttonCloseDoor_Click(object sender, EventArgs e)
{
await Client.CloseDoorAsync();
}
异步函数:
public async Task ConnectAsync(string address)
{
//some stuff happens here
// this blocks
//PieceOfEquipment = await Task.Run(() => VendorAPI.SomeProxy.Create(address));
// this does not block
PieceOfEquipment = await Task.Run(() => VendorAPI.SomeProxy.Create(address)).ConfigureAwait(false);
// some more stuff happens after
}
public async Task CloseDoorAsync()
{
await Task.Run(() => PieceOfEquipment.CloseDoor()); // this does not block
}
我很感激,鉴于黑盒 API 功能可能很难说为什么,但我希望在这里加深我的理解。
解决方案
推荐阅读
- wordpress - WP-CLI:用于删除订单的命令链 - 位置参数过多错误
- reactjs - asp.net react Boilerplate中的Antd表-行在单个单元格中绑定-在antd中支持动态绑定
- java - Android Intent 不将数据传输到另一个活动?Firebase 数据
- json - 如何将 JSON 文件放在 .net 核心应用程序表单的下拉列表中?
- php - Laravel 验证以确保值的差异
- css - 将第一个 tr 设置为固定而不丢失宽度
- c# - 日期绑定不绑定当前日期
- ios - 在 CupertinoTabBar 项目更改上重建 CupertinoTabBar 内容
- angular - 如何在路由器插座中调用同级组件功能并在 Angular 中等待其完成
- vb.net - 由于交换同步问题,MailItem 可以在解密后更改吗?