首页 > 解决方案 > TaskCompletionSource - 处理时代码停止执行

问题描述

我正在使用库来管理 WiFi。该库有一种基于事件扫描网络的方法。我用我的代码包装了这个库,我想将事件更改为异步模式。所以我的方法是这样的:

public Task ScanNetworksAsync()
{
    var tcs = new TaskCompletionSource<bool>();
    void Callback(Wlan.WlanNotificationData data)
    {
        switch (data.notificationCode)
        {
            case (int) Wlan.WlanNotificationCodeAcm.ScanFail:
                _wlanInterface!.WlanNotification -= Callback;
                tcs.SetResult(false);
                break;
            case (int) Wlan.WlanNotificationCodeAcm.ScanComplete:
                _wlanInterface!.WlanNotification -= Callback;
                tcs.SetResult(true);
                break;
        }
    }

    _wlanInterface!.WlanNotification += Callback;

    try
    {
        _wlanInterface!.Scan();
    }
    catch (Exception e)
    {
        tcs.SetException(e);
    }

    return tcs.Task;
}

重要的是在我处理内部客户端的地方实现 Dispose 方法。

public void Dispose() => ((IDisposable) _internalClient).Dispose();

我上课的地方:

internal class Program
{
    private static IContainer? _container;

    private static async Task Main(string[] args)
    {
        _container = new Startup().BuildContainer();
        await using (var scope = _container!.BeginLifetimeScope())
        {
            var s = scope.Resolve<IWiFiClient>();
            await s.ScanNetworksAsync();
        }

        SubscribeEvents();
    }
}

在这里我有一个问题。方法 SubsciveEvents 从不调用。当我改变

await s.ScanNetworkAsync();

s.ScanNetworkAsync().GetWaiter().GetResult();

然后一切正常,但我不知道为什么。

当我使用 await 但没有实现 dispose 方法时,一切都正常。

我不明白,因为任务在处置范围之前就完成了,为什么代码会挂起?

标签: c#asynchronousasync-await

解决方案


推荐阅读