0

私が理解しているように、 Parallel での作業DataContextはスレッドセーフではありませんが、コンテキストを次のように宣言した場合にのみstatic(MSDN のドキュメントに基づいて) これが私がしたことです。

MSDN : スレッド セーフ http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx

に関連する通常のエラーが発生しているようでDataContext、それはスレッドセーフの欠如です。

ここで、私がやりたいことと、私の望む結果を少し説明します。この場合、専門家の助けとアイデアを得られることを願っています。

10万件程度のレコードに対して重い分析処理をしたいのですが、

エラーは次のとおりです。

EntityMemberChanged または EntityComplexMemberChanged が、最初に同じプロパティ名を持つ同じ変更トラッカーで EntityMemberChanging または EntityComplexMemberChanging を呼び出さずに呼び出されました。変更を適切に報告する方法については、Entity Framework のドキュメントを参照してください。

Designer コードで次の行を指定します。

            ReportPropertyChanged("ProductName");

私のコードには何がありますか:

    //On form Load
    if (Repository.ContextP == null)
          Repository.ContextP = new dbEntities();

    private void btnProcess_Click(object sender, EventArgs e)
    {
       Task.Factory.StartNew(() =>
         Process(), TaskCreationOptions.LongRunning); 
    }   

    private void Process()
    {
        var query = from W in Repository.ContextP.Products
                select W;

        Parallel.ForEach(query, options , product =>
        {
           // There are some heavy processes to get stFormattedDef
           product.ProductName= stFormattedDef;               
        }
     }

     // The Repository - static
     static class Repository
     {
         public static dbEntities ContextP { get; set; } 
     }

セキュリティとデータ コンテキスト 分析がビルド段階にあり、ローカルであるため、ライフタイムが問題になることはありません。

私は何を間違えましたか?

助言がありますか?

同様のケースでのアイデアや経験はありますか?

4

1 に答える 1

2

ProductNameEFはわかりませんが、質問とコメントから、異なる s であっても、異なるスレッドから同時に設定できないことが問題だと思いますProduct(それらはすべて同じ非スレッドを使用するため) -安全DataContext)。

したがって、コストのかかる操作を並行して実行することをお勧めしますが、ProductName一度に 1 つのスレッドからのみ設定するようにしてください。これを実現する最も簡単な方法は、次を使用することですlock

var productLock = new object();

Parallel.ForEach(query, options , product =>
{
   // There are some heavy processes to get stFormattedDef

   lock (productLock)
   {
       product.ProductName = stFormattedDef;
   }
}

私が言ったように、私はEFを知らないので、問題を完全には理解していません。そのため、これは正しい解決策ではない可能性があります。

于 2012-06-24T16:06:22.683 に答える