Информация об изменениях

Сообщение Re: Вопрос по async/await для UI от 20.11.2019 6:49

Изменено 20.11.2019 7:00 RushDevion

Re: Вопрос по async/await для UI
S>Имеет ли право на жизнь такое использование async/await:

Имхо, работать-то будет, но целесообразность как-то сомнительна.
Диалоговое окно — это по определению что-то блокирующее основной UI, какой здесь смысл в асинхронщине?
Если только у тебе этих окошек открывается по несколько штук одновременно.

S>То есть правильно ли ожидать закрытия диалога через async/await? Вроде по тестам дедлока не происходит...

Дедлока не будет, но возможен unhandled exception, который не перехватится через try/catch (async void).
Если бы сигнатура была такой async Task GetUserSelection, то дедлок был бы возможен, в зависимости от того, как вызывается метод.


S>И, кстати, обязательно ли в таком случае переводить выполнение в поток UI, или же Task сам выберет правильный поток, из какого-бы потока не вызывали SetResult?

Имхо, не обязательно (если, конечно GetUserSelection, из ui потока изначально вызывается).
private async void GetUserSelection() {
      var dialog = new ModalDialog { ... };
      var userSelection = await dialog.ExecuteModal();

      // Это раскроется во что-то типа такого
      var sc = SyncronisationContext.Current; // Захватили UI-ный контекст синхронизации
      var task = dialog.ExecuteModal();
      task.OnCompleted = () => {
            sc.Post(()=>{ // Исполняем continuation на UI-ном контексте
                  var userSelection = task.Result;
                  // Doing something with result
              });
      }    
  }
}
Re: Вопрос по async/await для UI
S>Имеет ли право на жизнь такое использование async/await:

Имхо, работать-то будет, но целесообразность как-то сомнительна.
Диалоговое окно — это по определению что-то блокирующее основной UI, какой здесь смысл в асинхронщине?
Если только у тебе этих окошек открывается по несколько штук одновременно.

S>То есть правильно ли ожидать закрытия диалога через async/await? Вроде по тестам дедлока не происходит...

Дедлока не будет, но возможен unhandled exception, который не перехватится через try/catch (async void).
Если бы сигнатура была такой async Task GetUserSelection, то дедлок был бы возможен, в зависимости от того, как вызывается метод.


S>И, кстати, обязательно ли в таком случае переводить выполнение в поток UI, или же Task сам выберет правильный поток, из какого-бы потока не вызывали SetResult?

Имхо, не обязательно (если, конечно GetUserSelection, из ui потока изначально вызывается).
private async void GetUserSelection() {
      var dialog = new ModalDialog { ... };
      var userSelection = await dialog.ExecuteModal();

      // Это раскроется во что-то типа такого
      var sc = SyncronizationContext.Current; // Захватили UI-ный контекст синхронизации
      var task = dialog.ExecuteModal();
      task.GetAwaiter().OnCompleted = () => {
            sc.Post(()=>{ // Исполняем continuation на UI-ном контексте
                  var userSelection = task.Result;
                  // Doing something with result
              });
      }    
  }
}