c# - 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 方法时,一切都正常。
我不明白,因为任务在处置范围之前就完成了,为什么代码会挂起?
解决方案
推荐阅读
- ckeditor - CkEditor5 在哪里存储评论
- c# - .netcore 3.1 应用程序在哪里可以获得 appsettings.json?
- css - CSS Flexbox,内容从右到左,右对齐,底部对齐
- python - 如何在我的 numpy 数组中创建这个分区?
- android - 运行颤振医生时出错--android-licenses
- node.js - 如何在通用池中使用 maxClientWaings?
- javascript - 减少数组javascript中的数组
- typescript - 将 Behavior 主题集成到 Typescript 应用程序中
- jenkins - 从同一詹金斯服务器上的另一个詹金斯作业触发詹金斯作业得到443:连接被拒绝
- aws-lambda - aws lambda 无法在 eu-west-1 中启动步进函数