2

私はC#でMVC4Webサイトを開発しています。次のコードは、ConcurrentBagすべてをビューに渡す前に、(DisplayModels)にアイテムを入力する必要があります。

    Parallel.ForEach(model.Products, p =>
    {
        model.DisplayModels.Add(new DisplayBoardModel()
        {
            Market = model.Market,
            Product = p
        });
    });

    return View(model);

特定の実行で、DisplayModelsが別のポイントに入力されているように見えることがわかりました。各バックグラウンドタスクが戻る前にForEachが完了しているかのように。

私の理解では、Parallel.ForEach各アイテムを並行して処理しましたが、すべての作業が完了するまで呼び出しスレッドをブロックしていました。これは正しくありませんか?

モデルの準備が整う前にアクションが戻るのを止めるために他にやるべきことはありますか?通常の使用は正常に機能しforeachました

4

1 に答える 1

5

正常にParallel.ForEach()動作し、期待どおりに一度に完了します。

しかし、model.DisplayModels.Add()おそらくスレッドセーフではありません。どのコレクションを使用していますか?

これは、a)DisplayModelsの並行コレクションを使用するか、b)ForEachをPLINQクエリに変換することで修正できます。ただし、DisplayBoardModel()CPUの負荷が高い場合(およびctorは通常は機能しない場合)を除いて、これを並列化する意味はほとんどありません。

だから、単純なものを使うだけですforeach()


編集、新しい情報

各DisplayBoardModelはデータベース要求を行います

したがって、これは潜在的な原因です。すべてのDb操作は独自の接続(コンテキスト)を作成しますか?例外が黙って無視される可能性はありますか?

于 2013-02-07T13:17:55.597 に答える