Будут несколько Управление. Вызовы BeginInvoke/Invoke выполняются в порядке?

Я должен знать ли Управление. BeginInvoke и Управление. Вызовите вызовы, выполнится в порядке, которым их называют.

У меня есть следующий сценарий:

  1. Поток UI заблокирован
  2. WCF распараллеливают Управление вызовами. BeginInvoke
  3. WCF распараллеливают Управление вызовами. Вызовите (или возможно BeginInvoke снова)
  4. Поток UI разблокируется
  5. ??

Порядок выполнения шага 1-4, как гарантируют, будет в показанном порядке (технически, порядок, как гарантируют, не будет тем путем, но вопрос, который я имею, является только актуальным, если порядок как показано).

Вопрос, который я имею, состоит в том, существует ли шанс, что вызов Invoke/BeginInvoke на шаге 3 выполняется перед вызовом BeginInvoke на шаге 2?

Кроме того, не комментируйте блокирование потока UI.

13
задан cornergraf 10 December 2009 в 14:01
поделиться

4 ответа

В вашем случае шаг 2 всегда будет выполняться перед шагом 3. BeginInvoke в потоке пользовательского интерфейса будет выполняться в том порядке, в котором он был поставлен в очередь.

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

Это с помощью Delegate.BeginInvoke, что порядок выполнения может быть непоследовательным.

114987]

10
ответ дан 2 December 2019 в 00:46
поделиться

Вызовы BeginInvoke помещаются в очередь в целевом потоке (поскольку они публикуются в порядке поступления).

Синхронные вызовы в потоке WCF (шаг 3) могут выполняться до асинхронных вызовов (шаг 2) сделано из этой темы.

3
ответ дан 2 December 2019 в 00:46
поделиться

Вы не можете предположить это, но если между двумя приведенными выше вызовами существует какая-то форма зависимости, они будут ждать семафор и выполнять зависимый код только тогда, когда они оба завершены.

Если причина, по которой вы выполняете два вызова одновременно, не связана с производительностью, я бы, вероятно, просто выполнил второй вызов в обратном вызове первого (что значительно упрощает отладку).

0
ответ дан 2 December 2019 в 00:46
поделиться

Недостаточно информации, чтобы дать вам хороший ответ. Поток пользовательского интерфейса заблокирован, поэтому шаги 2 и 3 должны выполняться в другом потоке. Если между ними нет синхронизации, то откуда мы можем знать какой-либо порядок?

Thread 1        Thread 2                       Thread 3         Thread 4
Block UI        Calls BeginInvoke              
Unblock UI      Calls Invoke or BeginInvoke    BeginInvoke runs  BeginInvoke runs

У вас много параллелизма, но из того, что вы описали, мы не можем сказать вам, какие возможные порядки будут произойти, если не сказать: «Что угодно». Мы даже не можем сказать вам, что вызовы BeginInvoke не произойдут до того, как поток пользовательского интерфейса будет заблокирован или после того, как поток пользовательского интерфейса будет разблокирован.

0
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: