Task.Run глобальное окно сообщений, которое блокирует главное окно - PullRequest
0 голосов
/ 23 января 2019

Я запускаю ожидаемую функцию в конструкторе моего приложения WPF:

  Task.Run(async () =>
  {
      var r = await checkValidLicenseAsync(hardwareid);
      if (r == false)
        MessageBox.Show("no License.");
  }

Окно сообщений не блокирует мое главное окно.Я думаю, это потому, что я выполняю задание?Что такое обходной путь?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я не думаю, что вы можете вызвать ожидаемый метод в конструкторе.Поскольку конструктор не может быть добавлен асинхронный дескриптор.Вы можете вызвать делегата в конструкторе.Просто оберните свою логику в асинхронный делегат

0 голосов
/ 23 января 2019

Чего вы ожидаете от запуска этого кода в качестве задачи? Это не дает никаких преимуществ здесь. Возможно, долго выполняемая проверка лицензии уже вызывается с await, что делает его не блокирующим пользовательский интерфейс (если только не нарушена его реализация).

Чтобы блокировать окно сообщения, то есть модально, просто напишите

  bool valid = await checkValidLicenseAsync(hardwareid); // non-blocking
  if (!valid) {
      MessageBox.Show("no License."); // blocking
  }

Предполагая, что это System.Windows.MessageBox, а не его подвеска winforms.

Возможный подход - использовать фабричный метод для возврата объекта. Другой способ - использовать AsyncLazy<T>, как описано здесь Стивеном Клири

Смотри также: - ответ Свика на Могут ли конструкторы быть асинхронными? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...