Существует ли System.Threading.SynchronizationContext.Current.PostAsync ()? - PullRequest
1 голос
/ 02 сентября 2011

Я могу вернуть что-нибудь обратно в поток пользовательского интерфейса, например:

// when I am on the UI thread
var _UI = System.Threading.SynchronizationContext.Current;
// then on a background thread
_UI.Post((x) => { DoSomething(); }, null);

Но, если я нахожусь в этом фоновом потоке, чтобы сделать его асинхронным , то вызову _UI.Post() отменит мои усилия и заставит пользовательский интерфейс ждать выполнения DoSomething ().

Конечно, _UI.PostAsync () - это псевдокод.Но есть ли способ выполнить в потоке пользовательского интерфейса, но асинхронно ?По сути, я понимаю, что разоблачаю недостаток знаний и понимания.Будь милостив, пожалуйста.Я просто спрашиваю;)

1 Ответ

3 голосов
/ 02 сентября 2011

SynchronizationContext.Post () не будет блокировать фоновый поток, поскольку он асинхронно «отправляет» обратно в поток пользовательского интерфейса (в данном случае).

Поток пользовательского интерфейса будет блокировать толькона время вызова DoSomething() - но в этом случае вы говорите, что должен запустить его в потоке пользовательского интерфейса , и в этом случае он будет связывать поток пользовательского интерфейса.

Ключевым моментом здесь является поместить большую часть вашей работы в фоновый поток и вызывать .Post(...) только для операций, которые непосредственно устанавливают пользовательский интерфейс.Таким образом, они должны быть очень быстрыми и не блокировать пользовательский интерфейс (заметно).

...