Получение CoreDispatcher в приложении WinForms Classic Desktop - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть приложение C # WinForms, которое сканирует устройства Bluetooth в фоновом потоке. Когда пришло время подключиться к устройству, оно должно вызвать следующий метод, который должен быть вызван в потоке пользовательского интерфейса:

 var btDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress);

Я понимаю, что вы делаете это путем инкапсуляции вышеуказанного в асинхронный метод, такой как ConnectToBluetoothDevice, и вызова его так:

dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ConnectToBTDevice(args));

Пока все хорошо. Моя проблема в том, что я не могу получить ссылку на экземпляр CoreDispatcher , поэтому я могу выполнить вышеуказанный вызов. Я пробовал несколько способов:

  1. Неоднократно звонил:

    try
    {
      dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
    
    }
    catch (System.InvalidOperationException e)
    {
      Console.WriteLine("Cannot get dispatcher yet");
    }
    

    Вышеуказанное всегда относится к блоку catch, долгое время после запуска приложения.

  2. Регистрация обратного вызова для обратного вызова 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?

1 Ответ

0 голосов
/ 29 апреля 2018

Не все UWP API доступны из приложений Classic Desktop.

Вы можете сослаться на эту ссылку MSDN , которая объясняет, что только API, которые имеют атрибут DualApiPartition, могут вызываться из классического настольного приложения.

Посмотрите документацию для CoreDispatcher , и вы заметите, что не поддерживает атрибут DualApiPartition.

В качестве альтернативы классическое настольное приложение может ссылаться на класс Dispatcher , который доступен через WindowsBase.dll с использованием пространства имен System.Windows.Threading.

...