У меня есть приложение C # WinForms, которое сканирует устройства Bluetooth в фоновом потоке. Когда пришло время подключиться к устройству, оно должно вызвать следующий метод, который должен быть вызван в потоке пользовательского интерфейса:
var btDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress);
Я понимаю, что вы делаете это путем инкапсуляции вышеуказанного в асинхронный метод, такой как ConnectToBluetoothDevice
, и вызова его так:
dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ConnectToBTDevice(args));
Пока все хорошо. Моя проблема в том, что я не могу получить ссылку на экземпляр CoreDispatcher , поэтому я могу выполнить вышеуказанный вызов. Я пробовал несколько способов:
Неоднократно звонил:
try
{
dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
}
catch (System.InvalidOperationException e)
{
Console.WriteLine("Cannot get dispatcher yet");
}
Вышеуказанное всегда относится к блоку catch, долгое время после запуска приложения.
Регистрация обратного вызова для обратного вызова Form.Shown, а затем попытка получить экземпляр диспетчера из текущего потока пользовательского интерфейса, например:
var form = new Form1();
form.Shown += FormShown;
Application.Run(form);
...
private static void FormShown(Object sender, EventArgs e)
{
var window = CoreWindow.GetForCurrentThread();
if (window != null)
{
dispatcher = window.Dispatcher;
}
}
В этом случае window
всегда равно нулю, что меня удивляет, потому что весь смысл этого обратного вызова в том, что это происходит после отображения окна формы. Разве этот обратный вызов не должен быть в потоке пользовательского интерфейса и возвращать его CoreWindow?
Что мне здесь не хватает? Как я могу получить CoreDispatcher из приложения WinForms?