首页 > 解决方案 > 为什么我的 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 功能可能很难说为什么,但我希望在这里加深我的理解。

标签: c#async-await

解决方案


推荐阅读