我正在围绕Windows 10蓝牙低功耗API用MSTest编写一些TDD风格的代码。我有一个在扫描过程中发现BLE外围设备时由操作系统调用的回调。
void StartScan()
{
_BleWatcher = new BluetoothLEAdvertisementWatcher();
_BleWatcher.Received += ScanDiscovery;
_BleWatcher.Start();
}
// this usually fires in under a second, and always in under ten seconds
void ScanDiscovery(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs bleAdvert)
{
Debug.WriteLine("This handler was indeed called.");
throw new Exception();
}
如果我“运行选定的测试”并且回调中发生异常,则显然正在运行的进程未检测到该异常。测试通过,并且异常不会阻止被测单元正常运行。
[TestMethod]
async Task ScanTest()
{
StartScan();
await Task.Delay(10000);
// this always completes, even though I see the debug message in the Output
}
但是,如果我“调试选定的测试”,Visual Studio会按预期警告我该异常!
诸如BluetoothLEAdvertisementWatcher.Received之类的Windows API如何确定进程如何路由和捕获异常是否存在“差异”?
该项目针对.NET Standard 2.0,使用this trick访问UWP API。
答案 0 :(得分:0)
没有在您的线程上引发ScanDiscovery事件。它是通过调用_BleWatcher.Start()创建的线程引发的。由于它不在与ScanTest()相同的线程上运行,因此您无法在那里捕获异常。
在调试模式下,无论在哪个线程上运行,都将在引发异常时Visual Studio停止。
您需要在ScanDiscovery内捕获异常,或查看类似AppDomain.UnhandledException的内容。