Нужна ли мне дополнительная подготовка перед отправкой намерения из другого потока? - PullRequest
1 голос
/ 06 августа 2020

Я использую термин Задача контекст - как C# Тип задачи - и Android контекст , чтобы различать эти две сущности.

Лучше попросите быть уверенным на 100% - когда вы работаете с WPF или WindowsForms, вы не можете свободно взаимодействовать с UI. Например, когда вы используете await, вы хотите сохранить контекст задачи (поэтому не обычно ConfigureAwait(false)).

Итак, мой вопрос - когда я пытаюсь отправить намерение из другого потока, я должен также сделайте некоторую подготовку, скажем, когда я использую await, должен ли я сохранять контекст задачи? Или это сам процесс отправки подготовки - что-то вроде (надуманной) аналогии с Dispatcher.Invoke в WPF?

Другими словами, могу ли я просто слепо отправлять намерение независимо от того, в каком потоке я нахожусь, пока мой Android контекст действителен? Или, может быть, это зависит от целевого потока - когда, например, это основной / пользовательский поток, я должен сделать что-то дополнительное, или он всегда будет работать правильно?

1 Ответ

1 голос
/ 06 августа 2020

Предполагая, что вы использовали asyn c и шаблон ожидания правильно, тогда не должно быть необходимости маршалировать обратно в поток пользовательского интерфейса . Это то же самое, что и в winforms и WPF .

Исключение из правила - когда вы знаете, что НЕ работает на Контекст пользовательского интерфейса (то есть, если вы использовали Task.Run для разгрузки в другой поток и т. Д.), И в этом случае вы должны вызвать следующее, чтобы маршалировать обратно в поток пользовательского интерфейса

Device.BeginInvokeOnMainThread

Вызывает действие в основном потоке (UI) устройства.

Выше Xamarin.Forms эквивалент Dispatcher.Invoke

...