Сообщение 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 потока изначально вызывается).
Имхо, работать-то будет, но целесообразность как-то сомнительна.
Диалоговое окно — это по определению что-то блокирующее основной 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 потока изначально вызывается).
Имхо, работать-то будет, но целесообразность как-то сомнительна.
Диалоговое окно — это по определению что-то блокирующее основной 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
});
}
}
}