使用多线程时在DB中插入行?

Yas*_*ahu 6 linq sql-server multithreading c#-4.0

这里我使用多线程和linq到SQL.

在这里,我上传了我的代码片段:

public class PostService
{ 
    MessageRepository objFbPostRespository = new MessageRepository();
    public void callthreads()
    {
        for (int i = 0; i < 100; i++)
        {
            Thread th = new Thread(postingProcess);
            th.Start();
        }
    }

    public void postingProcess()
    {
        objFbPostRespository.AddLog("Test Multithread", DateTime.Now);
    }
}
Run Code Online (Sandbox Code Playgroud)

Message Repository类

class MessageRepository
{        
    DataClassesDataContext db_Context = new DataClassesDataContext();
    public void AddLog(string Message, DateTime CurrentDateTime)
    {
        FbMessgaeLog FbMessage = new FbMessgaeLog
        {
            Message = Message,
            Time = CurrentDateTime                
        };
        db_Context.FbMessgaeLogs.InsertOnSubmit(FbMessage);
        db_Context.SubmitChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在没有线程的情况下运行它然后它在包含线程之后工作正常我得到以下错误消息:

错误:已添加具有相同键的项目.

提前致谢...:)

Rem*_*anu 3

您不能以并发方式使用 LINQ DataContext :

不保证任何实例成员都是线程安全的。

因此,您需要序列化访问(锁定),这将非常低效,或者更好地在每个线程中使用单独的上下文:

public class PostService
{ 
    public void callthreads()
    {
        for (int i = 0; i < 100; i++)
        {
            Thread th = new Thread(postingProcess);
            th.Start();
        }
    }

    public void postingProcess()
    {
        using (MessageRepository objFbPostRespository = new MessageRepository())
        {
           objFbPostRespository.AddLog("Test Multithread", DateTime.Now);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还希望,为了您自己的利益,您的测试具有实际的逻辑来等待测试线程在关闭之前完成...当然,在您的存储库中正确实现 IDisposable 并处理上下文,以便数据库连接得到放回池中。