问题:使用通用列表的方法需要很长时间才能处理。因此,该方法应该放在背景工作者身上。
问题如下:如何从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 :(得分: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
方法返回此类型,如果您确实需要在worker中使用可变列表,那么解决方案将略有不同(并且更加混乱,因为它意味着您需要在变更时开始锁定列表。