Здравствуйте, Somescout, Вы писали:
S>То есть правильно ли ожидать закрытия диалога через async/await? Вроде по тестам дедлока не происходит. И если чуть усложнить вопрос: может ли произойти дедлок, если вызов taskSource.SetResult был сделан через синхронизацию с потоком UI из другого потока:
S>S> private async void OnMessageArrived() { // Вызывается не из потока ui
S> InvokeAsync(() => { // Передаём выполнение в поток UI
S> taskCompletionSource.SetResult(someResult); // сигнализируем о завершении диалога
S> });
S> }
S>
S>И, кстати, обязательно ли в таком случае переводить выполнение в поток UI, или же Task сам выберет правильный поток, из какого-бы потока не вызывали SetResult?
На ксамарине во всяком случае после taskCompletionSource.SetResult(someResult) выполняется в том же потоке из которого вызывается этот SetResult.
Но так как у меня дальше шли await я особо и не парился.
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
см AsyncProducerConsumerCollection<T>
Но вот что касается контекста синхронизации, то по идее
await dialog.ExecuteModal() должен выполнится в потоке UI если не добавлен ConfigureAwait(false);
https://ru.stackoverflow.com/questions/681382/Использование-configureawaitfalse