Подтвердить что ты не робот

Будут ли выполняться несколько вызовов Control.BeginInvoke/Invoke?

Мне нужно знать, будут ли вызовы Control.BeginInvoke и Control.Invoke выполняться в том порядке, в котором они вызываются.

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

  • Пользовательский интерфейс заблокирован
  • вызовы потоков WCF Control.BeginInvoke
  • Вызов WCF вызывает Control.Invoke(или, возможно, BeginInvoke)
  • поток пользовательского интерфейса разблокирован
  • ??

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

У меня есть вопрос, есть ли вероятность, что вызов Invoke/BeginInvoke на шаге 3 выполняется до вызова BeginInvoke на шаге 2?

Кроме того, не комментируйте блокировку потока пользовательского интерфейса.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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