据我了解,使用DataContext并行工作不是线程安全的,但前提是您将上下文声明为static(基于 MSDN 文档)这就是我所做的,一旦我发现它有效,而另一次它失败了!
MSDN: 线程安全“这种类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。” http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx
似乎我遇到了与 Thread-Safety 相关的DataContext常见错误。
在这里我解释一下我想做什么,我想要的结果是什么,希望得到专家的帮助和想法。
我想对大约 100,000 条记录进行繁重的分析,
错误是:
EntityMemberChanged 或 EntityComplexMemberChanged 是在没有首先在具有相同属性名称的同一更改跟踪器上调用 EntityMemberChanging 或 EntityComplexMemberChanging 的情况下调用的。有关正确报告更改的信息,请参阅实体框架文档。
指向设计器代码中的这一行:
            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; } 
     }
安全性和数据上下文生命周期应该不是问题,因为分析处于构建阶段并且是本地的。
我做错了什么?
有什么建议么?
类似案例的想法或经验?