C# parallel.foreach和insertonsubmit primarykey问题

C# parallel.foreach和insertonsubmit primarykey问题,c#,C#,我正在尝试实现一个并行的.foreach,它里面有一个InsertOnSubmit 大多数情况下,一切正常,但偶尔我会遇到一个例外: 违反主键约束-无法插入重复键 我尝试过不同的并行选项,但并不一致。我没有为循环的每次迭代使用相同的DataContext,对于在并行.foreach循环中使用InsertOnSubmit有什么建议吗 while (myConcurrentDictionary.Count > 0) { Parallel.ForEach(myConcurrentDict

我正在尝试实现一个并行的.foreach,它里面有一个
InsertOnSubmit

大多数情况下,一切正常,但偶尔我会遇到一个例外:

违反主键约束-无法插入重复键

我尝试过不同的并行选项,但并不一致。我没有为循环的每次迭代使用相同的DataContext,对于在
并行.foreach
循环中使用
InsertOnSubmit
有什么建议吗

while (myConcurrentDictionary.Count > 0)
{
    Parallel.ForEach(myConcurrentDictionary, pOptions, (KVP, loopState) =>
    {
        pOptions.CancellationToken.ThrowIfCancellationRequested();

        passCount++;
        MsgLog.WriteLine(KVP.Key);
        processKVP(KVP.Key, KVP.Value, loopState);
    }); //End of Parallel.ForEach loop
}


processKVP()
{
    ...
    DCtxt myDC = new DCtxt();

    myDC.TABLE.InsertOnSubmit(new TABLE
    {
       ...
    });
    insertCount++;

    if ((insertCount % 100) == 0)
    {
      myDC.SubmitChanges();
    }
}

我找到了这个上面的bug。应用程序正在调用一个Web服务,该服务创建带有时间戳的文件,这是导致此问题的原因。因为我并行调用web服务,所以同时创建了多个文件

因此,通过创建一个增加到十万分之一的时间戳,这个问题得到了纠正:

DateTime.Now.ToString(“yyyy\u MM\u dd\u hhmmssfff”)


谢谢大家的评论。

您能给我们看一下foreach代码吗?您使用的是非线程安全对象。不要这样做。您是在为每个迭代使用新的数据上下文,还是在不这样做的情况下尝试确保对每个迭代的同步访问?如果是前者,则是DB模式或DB本身的一个更基本的问题。如果是后者,你只是做得不好,不应该一开始就费心去做。你已经发布了你的代码,但是除了调用一个你没有显示定义的方法之外,它并没有做任何有趣的事情
processKVP
可能是您的错误所在。在我们看到的非常少的代码中,您正在递增一个名为
Passcont
的变量,该变量不是线程本地变量。所以它很可能被多个线程破坏。最好用
Interlocked.Increment(ref passCount)替换该行