2014-04-03 35 views
0

我已經看到了幾個線程,介紹如何從後臺工作人員更改UI元素,但我的問題是與相反的過程。我有一個ListView,其中包含一些複選框旁邊的項目。我有一個背景工作者應該將數據寫入到ListView中選中的項目的csv中。我的問題是我無法訪問存儲在我的主窗體上的ListView.CheckedItems列表。有沒有一種優雅的方式來從後臺工作者訪問這些數據,還是我必須使用一些糟糕的解決方法,將列表存儲在EventArgs參數的參數中?C# - 如何從背景工作線程訪問表單控件中的信息

作爲一個例子,下面的代碼將創建一個目錄爲每一個檢查條目;如果沒有跨線程問題:

private void WriteToCSV(Dictionary<string,PointPairList> curves) 
    { 
    foreach (KeyValuePair<string, PointPairList> entry in curves) 
     { 
      if (SaveListView.CheckedItems.ContainsKey(entry.Key)) 
      { 
       string curveDir = Path.Combine(this.dirString, entry.Key); 
       if (!Directory.Exists(curveDir)) 
       { 
        Directory.CreateDirectory(curveDir); 
       } 
      } 
     } 
    } 

所以,問題是,如果這個方法是從BackgroundWorker的調用, 「SaveListView」是主窗體上的列表視圖,如何在不引發交叉線程異常的情況下訪問SaveListView?

謝謝你可以做的任何事情。

+0

另請參閱:http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the –

回答

2

這樣做的優雅方式是僅創建您感興趣的數據(如目錄)的列表,並將其傳遞給BackgroundWorker的DoWorkEventArgs

您不應該將Forms控件傳遞給BackgroundWorker;這樣做會導致跨線程異常,導致用戶界面崩潰,並導致競爭條件,因爲UI和工作人員都嘗試使用相同的數據。只將實際需要的數據傳遞給另一個線程。