1. ホーム
  2. c#

[解決済み] Parallel.ForEachとリストへの追加

2023-03-30 22:58:22

質問

遠隔地(ネットワーク経由)に接続し、一般的なリストを返す関数を複数実行しようとしています。しかし、私はそれらを同時に実行したいのです。

例えば

public static List<SearchResult> Search(string title)
{
    //Initialize a new temp list to hold all search results
    List<SearchResult> results = new List<SearchResult>();

    //Loop all providers simultaneously
    Parallel.ForEach(Providers, currentProvider =>
    {
        List<SearchResult> tmpResults = currentProvider.SearchTitle((title));

        //Add results from current provider
        results.AddRange(tmpResults);
    });

    //Return all combined results
    return results;
}

私の見るところ、「結果」に対する複数の挿入が同時に起こるかもしれません...。私のアプリケーションをクラッシュさせるかもしれません。

どうすればこれを避けることができますか?

どのように解決するのですか?

//In the class scope:
Object lockMe = new Object();    

//In the function
lock (lockMe)
{    
     results.AddRange(tmpResults);
}

基本的にロックとは、1つのスレッドだけが同時にそのクリティカルセクションにアクセスできることを意味します。