2013-04-24 2 views
4

Нужно ли мне синхронизировать вызовы в Dispatcher.Invoke при доступе к нескольким фоновым потокам?синхронизировать wpf dispatcher.invoke из нескольких фоновых потоков

Я знаю, что Dispatcher.BeginInvoke автоматически синхронизирует вызовы для SilverLight приложения (http://msdn.microsoft.com/en-us/library/z8chs7ft(v=vs.95).aspx)

ли это также верно и для приложения WPF или я должен раскомментируй заявление блокировки ниже.

public MainWindow() 
    { 
     InitializeComponent(); 

     Dispatcher.BeginInvoke(new Action(() => 
      { 
       const int MAX_NR_THREADS = 1000; 
       for (int i = 0; i < MAX_NR_THREADS; ++i) 
       { 
        int j = i+1; 
        new Thread(()=>ThreadMethod(j)).Start(); 
       } 
      })); 
    } 


    private void ThreadMethod(int threadId) 
    { 
     const int ONE_MILLION = 1000000; 
     for (int i = 0; i < ONE_MILLION/threadId; ++i) 
     {    

      //lock(lockObj) 
      //{     
       this.Dispatcher.Invoke(new Action(() => 
        { 
         int sum = 0; 
         for (int j = 0; j < ONE_MILLION/10000; ++j) 
         { 
          sum += j; 
         } 
         int a = sum; 
         concurrentQueue.Enqueue(threadId*ONE_MILLION);      
        }));      
      //}     
     } 
    } 

ответ

6

Нет необходимости синхронизировать эти вызовы. Dispatcher.Invoke фактически действует как очередь для ваших вызовов и не требует синхронизации.

Смежные вопросы