2011-01-10 73 views
0

我有以下代碼,其中我試圖處理大量的數據,並更新UI。我使用後臺工作人員嘗試過相同的事情,但我遇到了類似的問題。問題似乎是,我試圖使用一個未在新線程上實例化的類(實際的錯誤是當前線程沒有「擁有」該實例)。我的問題是,有沒有一種方法可以在線程之間傳遞此實例以避免此錯誤?線程之間傳遞數據

DataInterfaceClass dataInterfaceClass = new DataInterfaceClass(); 

private void OutputData(List<MyResult> Data) 
{    
    progressBar1.Maximum = Data.Count; 
    progressBar1.Minimum = 1; 
    progressBar1.Value = 1; 

    foreach (MyResult res in Data) 
    {      
     // Add data to listview 
     UpdateStatus("Processing", res.Name); 

     foreach (KeyValuePair<int, string> dets in res.Details) 
     { 
      ThreadPool.QueueUserWorkItem((o) => 
      { 
       // Get large amount of data from DB based on key 
       // – gives error because DataInterfaceClass was 
       // created in different thread. 
       MyResult tmpResult = dataInterfaceClass 
        .GetInfo(dets.DataKey); 

       if (tmpResult == null) 
       { 
        // Updates listview 
        UpdateStatus("Could not get details", 
         dets.DataKey); 
       } 
       else 
       { 
        UpdateStatus("Got Details", dets.DataKey); 
       } 

       progressBar1.Dispatcher.BeginInvoke(
        (Action)(() => progressBar1.Value++)); 
      }); 
     } 
    } 
} 

編輯:

DataInterfaceClass實際上definated並且它使用的功能之外創建的,但它是一個實例,而不是靜態的。

回答

1

UPDATE: 你似乎已經修改了發佈的源代碼,所以...

您應該專門創建DataInterfaceClass的實例,每個後臺線程或任務。爲您的任務提供足夠的輸入來創建自己的實例。這就是說,如果您嘗試以高度並行的方式訪問單個數據庫中的數據,這可能會導致數據庫超時。即使您可以讓您的數據訪問以多線程方式工作,我也會建議限制同時執行的後臺任務數量以防止發生這種情況。

您可以使用Semaphore(或類似的)來確保不超過一定數量的任務同時運行。

+0

我更新了問題,因爲它確實出現DataInterfaceClass是靜態的 - 事實並非如此。至於同時執行任務的數量,其目的僅僅是讓進程在運行時更新UI(所以我不認爲數據訪問是同時發生的)。 – 2011-01-10 11:45:36

0

OutputData方法定義的類中創建一個DataInterfaceClass的全局實例,這樣你就可以在方法中使用它。

但是,您需要謹慎使用它。如果所有線程都使用相同的實例從數據庫中讀取,則會導致錯誤。

您應該在每個線程中創建一個DataInterfaceClass的新實例,或者在您的GetInfo方法內部實施一些鎖以避免多個訪問問題。