2010-12-17 48 views
2

在完成所有處理後,我正在運行使用Parallel.Invoke的重度後臺工作我返回該方法,再次返回,調用下一個方法來利用計算的數據我得到錯誤: 跨線程操作無效:從其創建的線程以外的線程訪問控制''。使用parallel.Invoke運行後臺工作後更新用戶界面

但是我已經從由Parallel.Invoke創建的線程返回到第一個調用它的線程中。控制不能恢復到啓動的線程是否正常?我怎麼能保證這確實發生?

代碼:

public void TopMethod() 
     { 
      Calculate(4); 
      UpdateGui(); 
     } 

     public void Calculate(int depth) 
     { 
      Recursive(depth); 
     } 

     public void Recursive(int depth) 
     { 
      if (depth > 0) 
       System.Threading.Tasks.Parallel.Invoke(
          delegate { Recursive(depth - 1); }); 
     } 

     public void UpdateGui() 
     { 
      CalculateOhter(); // Works fine. 
      controlElement.Focus(); // Causes exception 
     } 

編輯: 我知道Control.Invoke但這將是一個醜陋的解決方案(不想存儲代表在每個控制),程序需要等待所有的計算,以在它可以繼續之前完成。所以,如果我能以某種方式強制控制返回到我最初開始使用的線程,那將會更好。

回答

0

可怕的做法是將Control.CheckForIllegalCrossThreadCalls設置爲false。它應該擺脫你的錯誤,但它不是好的設計。

當一個控件的創建線程以外的其他線程嘗試訪問該控件的某個方法或屬性時,就會出現該問題,這通常會導致不可預知的結果。

0

Control.Invoke的例子涉及存儲一個委託,可以做到這一點,而不需要爲每個控件存儲一個委託?所以傳遞我需要調用的方法作爲Invoke調用的一個參數(嘗試過但不能讓它工作)。

程序需要等待所有的計算完成才能繼續,所以如果我能以某種方式強制控制返回到我最初開始使用的線程會更好。

我不明白爲什麼這不會在默認情況下發生,爲什麼它不只是返回到一切完成時開始的線程?

0

解決了這個問題,事實證明,我創建了一個獨立的線程來首先調用給定的代碼,有點愚蠢:P

相關問題