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

Сообщение Re: Вопрос по async/await для UI от 22.11.2019 10:15

Изменено 22.11.2019 14:29 Serginio1

Re: Вопрос по async/await для UI
Здравствуйте, 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) выполняется в том же потоке из которого вызывается.
То есть лучше вызвать в потоке UI
Re: Вопрос по async/await для UI
Здравствуйте, 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.
Но так как у меня дальше шли async await я особо и не парился.
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
см AsyncProducerConsumerCollection<T>
То есть лучше вызвать в потоке UI