0

問題: ジェネリック リストを使用するメソッドは、処理に時間がかかります。したがって、メソッドはバックグラウンドワーカーに配置する必要があります。

問題は次のとおりです。Backgroundworker から一般的な List にアクセスするにはどうすればよいでしょうか。

[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;

メソッドがこの型を返すためIEnumerableCast実際にワーカーで変更可能なリストが必要な場合は、解決策が少し異なります (リストが変更されたときにリストのロックを開始する必要があることを意味するため、より面倒です)。

于 2013-02-22T11:05:42.350 に答える