2013-03-02 3 views
0

В проекте C# WPF у меня есть фоновый поток, который должен обновить некоторые UserControls. Чтобы сделать это, я использовал Dispatcher.Invoke:Когда выполняется код внутри Dispatcher.Invoke?

Dispatcher.Invoke(DispatcherPriority.Normal, (MethodInvoker)delegate() 
    { 
     // Code 
    } 

Но я задаюсь вопросом:

  • когда код внутри делегата будет выполняться в основном потоке?
  • Для его выполнения можно остановить метод, обычно работающий на основном потоке?
  • Может ли использование Dispatcher.Invoke привести к условиям гонки?

Спасибо большое, Emanuele

+0

Этот код запускается в основном потоке пользовательского интерфейса, но нам нужно будет узнать больше о том, что вы пытаетесь (или о том, что вы видите), чтобы иметь возможность разумно ответить на остальную часть вашего вопроса. – ChrisF

ответ

2

когда код внутри делегата будет выполняться в основном потоке?

Делегат будет выполнять основную нить один раз, если все operations with priority greater than Normal got a chance to execute.

Для выполнения этого метода, который обычно работает на основной нити, может быть остановлен ?

Метод Invoke позволяет делегату выполнить синхронно в основном потоке, но если вы хотите выполнить его асинхронно, вам нужно использовать BeginInvoke. В случае, если какой-либо делегат работает в основном потоке, ваш delegate will get queued and will run once executing operation gets completed. Однако ваш фоновый поток не будет двигаться вперед, если делегат не будет выполнен.

Может ли использование Dispatcher.Invoke привести к условиям гонки?

No, с тех пор как делегат попадает в очередь в диспетчерской очереди.

+0

Я думаю, что вы означали ** ** ** синхронно во второй части вашего предложения. –

+0

@ Ravadre - Да спасибо .. Обновлено !! –

0
  1. именно, когда поток UI может переключить его выполнение на SynchronizationContext.Send вызова.
  2. При выполнении этого метода, который обычно запускается на основной нити, будет завершен (включая другие условия без отделки, такие как yield или await), а затем ваша функция будет запущена.
  3. No.
Смежные вопросы