首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BackgroundWorker:向BackgroundWorker传递泛型列表

BackgroundWorker:向BackgroundWorker传递泛型列表
EN

Stack Overflow用户
提问于 2013-02-22 18:34:23
回答 1查看 985关注 0票数 0

问题:使用泛型列表的方法需要很长时间才能处理。因此,应该将该方法交给后台工作人员。

问题如下:如何从Backgroundworker访问通用列表?

代码语言:javascript
运行
复制
[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
...
}

我想做一些像这样的事情

代码语言:javascript
运行
复制
private void backgroundWorker_DoWork<T>(object sender, DoWorkEventArgs e, List<T> theList) where T : Interface

但却不知道如何使用它。

我是不是漏掉了什么明显的东西?

EN

回答 1

Stack Overflow用户

发布于 2013-02-22 19:05:42

解决此类问题的常用方法是创建一个非泛型接口,该接口公开泛型类型中所需的属性/方法

在这种情况下,您可以使用一个接口来公开期望后台工作人员使用的泛型的元素,比如IListItem

然后将您的泛型列表作为它们的列表传递,并在传入过程中进行转换(请注意,我也使用了IEnumerable -请参见下文):

代码语言:javascript
运行
复制
backgroundWorker.RunWorkerAsync(new Tuple<string, int, 
        IEnumerable<IListItem>>(aInfo, aCount, aGenericList.Cast<IListItem>()));

请注意,您需要将列表重新转换为接口类型才能传递它。

最后,在您的DoWork方法中,您现在可以强制转换为您知道的内容:

代码语言:javascript
运行
复制
Tuple<string, int, IEnumerable<IListItem>> aTuple = 
            (Tuple<string, int, IEnumerable<IListItem>>)e.Argument;

我使用IEnumerable是因为Cast方法返回此类型,如果您确实需要worker中的可变列表,那么解决方案将略有不同(并且更混乱,因为它意味着您需要在列表发生更改时开始锁定列表)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15022101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档