2012-04-20 50 views
5

這是我現有的代碼,一些數據保存到多張表SqlConnection的並行編程

using (SqlConnection conn = new SqlConnection("myConnString")) 
{ 
    DoWork1(conn); 
    DoWork2(conc); 
    DoWork3(conn); 
} 

爲了加快我的代碼,所以我試圖讓.NET TPL支持,我rehanged我的代碼如下

using (SqlConnection conn = new SqlConnection("myConnString")) 
{ 
    ParallelOptions pw = new ParallelOptions(); 
    pw.MaxDegreeOfParallelism = Environment.ProcessorCount; 

    Parallel.Invoke(pw,()=> DoWork1(conn),()=> DoWork2(conc),()=> DoWork3(conn)); 
} 

但是,這引發了我的數據訪問層中ExecuteNonQuery()方法的內部連接致命錯誤異常。我的並行方法是錯誤的嗎?

+0

「我的平行方法是錯誤的嗎?」 - 很可能。 – 2012-04-20 05:48:02

回答

8

那麼,有辦法可以潛在使用MARS工作 - 但我會建議一種不同的方法。 (我不知道MARS是否支持跨多個線程使用相同的連接,即使它允許多個併發操作。)

而不是嘗試在所有並行任務中重用一個連接,使每個任務打開(並關閉)爲自己的連接,並讓連接池處理效率方面。這是.NET中的一般最佳實踐,無論您是否使用並行:打開連接,做一些工作,關閉連接。

+0

謝謝您的快速響應。我會嘗試第二種方法(每次操作打開和關閉連接一次) – Renushi 2012-04-20 06:25:56