BackgroundWorker:将一个通用列表传递给BackgroundWorker
本文关键字:BackgroundWorker 列表 一个 | 更新日期: 2023-09-27 18:00:27
问题:使用泛型列表的方法需要很长时间才能处理。因此,这个方法应该交给一个幕后工作者。
问题如下:如何从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
但不知道这是怎么用的。
我是不是错过了一些显而易见的东西?
解决此类问题的一种常见方法是创建一个非通用接口,该接口公开您需要的通用类型的属性/方法
在这种情况下,您可以使用一个接口来公开后台工作人员希望使用的泛型元素,比如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中的可变列表,那么解决方案将略有不同(而且更混乱,因为这意味着您需要在列表更改时开始锁定它)。