2013-02-22 138 views
0

問題:使用通用列表的方法需要很長時間才能處理。因此,該方法應該放在背景工作者的位置。BackgroundWorker:將通用列表傳遞給BackgroundWorker

問題如下:如何從Backgroundworker訪問泛型列表?

[Call] 
backgroundWorker.RunWorkerAsync(new Tuple<string, int, List<T>>(aInfo, aCount, aGenericList)); 

... 
[DoWork] 
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
      BackgroundWorker worker = sender as BackgroundWorker; 


      Tuple<string, int, List<T>> aTuple = (Tuple<string, int, List<T>>)e.Argument; // won't work as <T> is not known 
... 
} 

我想這樣做

private void backgroundWorker_DoWork<T>(object sender, DoWorkEventArgs e, List<T> theList) where T : Interface 

,但不知道這到底是怎麼被使用。

我錯過了一些明顯的東西嗎?

+0

您可以將列表聲明爲全局變量。或者把它放到課堂範圍 – 2013-02-22 10:39:40

+0

@GianAcuna作爲全球變量,我甚至會遇到如何創建它的問題。 '私人列表 aList;'不會編譯(因爲T不知道) – Offler 2013-02-22 10:41:52

+0

某處必須是已知的!當您調用RunWorkerAsync()時如何知道? – 2013-02-22 10:42:57

回答

1

一種常見的方法來這樣的問題是創建一個非通用接口暴露你從你的泛型類型

在這種情況下,需要你可以使用一個接口,使您的通用的元素屬性/方法該後臺工作,預計使用,說IListItem

您然後通過你的泛型列表作爲這些列表,在鑄造它的方式(請注意,我還用IEnumerable - 見下文):

backgroundWorker.RunWorkerAsync(new Tuple<string, int, 
     IEnumerable<IListItem>>(aInfo, aCount, aGenericList.Cast<IListItem>())); 

請注意,您需要將您的列表重新改寫爲接口類型以將其傳遞。

最後,在DoWork方法,你現在可以施展你知道的東西:

Tuple<string, int, IEnumerable<IListItem>> aTuple = 
      (Tuple<string, int, IEnumerable<IListItem>>)e.Argument; 

我用IEnumerable因爲Cast方法返回類型,如果你確實需要在工人的可變列表,然後,該解決方案將略有不同(並且更加混亂,因爲它意味着您需要在列表發生變化時開始鎖定列表)。

+0

我的問題與答案:該方法是用來傳遞對象到另一臺用戶的願望。在泛型方法之前,我有一個List 和訪問成員(因爲完整的objet應該被轉移)的問題,這些成員不是全部都可以訪問。因此,這已經改變了很長時間,回到通用方法,同時幾乎所有的接口都從應用程序中消失。 – Offler 2013-02-22 11:25:04

+0

那麼這是什麼傳遞機制 - 也許你需要在你將類傳遞給工作人員之前序列化你的類? – 2013-02-22 11:28:43

+0

調用對象本身的方法。 BaseClasses打開適當的WCF連接並傳輸對象和子對象(如果僅更改了屬性,則只是一些屬性)。當試圖通過接口訪問sthe屬性時,有些屬性不再被找到。 (這並不意味着我認爲你的答案是不正確的,它應該是一種可能的方式 - 但我仍然想知道是否有辦法在後臺工作中獲得通用) – Offler 2013-02-22 11:34:07