2011-04-15 73 views
6

在這裏,我使用多線程和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); 
    } 
} 

消息庫類

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(); 
    } 
} 

當我運行無緒那麼它的做工精細之後包括螺紋,我得到了以下錯誤信息:

錯誤:具有相同鍵的項目已經已被添加。

在此先感謝... :)

+1

你的數據庫在這裏用什麼作爲它的關鍵? – Jens 2011-04-15 13:13:18

+0

@Jens我會認爲它是一個數據庫標識列,這是主要問題 – Manatherin 2011-04-15 13:42:31

+2

您的要求是什麼使您選擇多線程方法?你不能使用隊列來推送項目以便立即寫入和返回,並讓後臺工作人員按順序執行這項工作嗎? – 2011-04-15 14:03:40

回答

3

不能在並行的方式下使用LINQ DataContext

Any instance members are not guaranteed to be thread safe.

因此,你需要或者串行訪問(鎖定),這將是可怕的效率低下,或更好的在每個線程使用一個單獨的上下文:

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); 
     } 
    } 
} 

爲了您自己的利益,我也希望您的測試具有實際的邏輯,以便在關閉之前等待測試線程完成......當然,在您的存儲庫中正確實施IDisposable並處理上下文,以便數據庫連接放回池中。

0

我懷疑你正在使用的時間作爲主鍵或唯一約束。如果是這樣,那是您的問題,您應該使用identityuniqueidentifier

身份將更具可讀性,因爲它將是遞增的數字值。它也會很有用,因爲它通常會告訴你記錄插入的順序,以後可能會有用。

Uniqueidentifier的優點是您可以事先選擇它,而不用等待數據庫提供的內容。

對於日誌記錄類型的應用程序,我會推薦一個標識列。

0

我以前用LINQ to SQL DataContexts遇到過問題,記住我以前提交過的對象,並在下次提交時嘗試再次插入它們。這聽起來像你可能會遇到類似的事情。

我想出的解決方案是在每次調用SubmitChanges()後處理舊的DataContext並重新開始一個新的。

相關問題