0

问题:使用通用列表的方法需要很长时间来处理。因此,该方法应该放在后台工作人员中。

问题如下:如何从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

但不知道如何使用它。

我错过了一些明显的东西吗?

4

1 回答 1

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方法返回这种类型,如果您确实需要工作人员中的可变列表,那么解决方案将略有不同(并且更混乱,因为这意味着您需要在列表更改时开始锁定列表)。

于 2013-02-22T11:05:42.350 回答