我正在寫dll,它會異步執行一些操作。例如,一些與數據庫相關的操作。 例如:多線程最佳實踐
(new Action(()=>
{
// database blablabla
}
)).BeginInvoke((x)=>{}
,null);
我知道,大約threadqueue,約backgroundworkers,約Thread類等 我的問題:什麼是做到這一點的最好方法是什麼?我做對了嗎? 未來可以引起麻煩嗎?
我正在寫dll,它會異步執行一些操作。例如,一些與數據庫相關的操作。 例如:多線程最佳實踐
(new Action(()=>
{
// database blablabla
}
)).BeginInvoke((x)=>{}
,null);
我知道,大約threadqueue,約backgroundworkers,約Thread類等 我的問題:什麼是做到這一點的最好方法是什麼?我做對了嗎? 未來可以引起麻煩嗎?
我有an article on my blog,它討論了異步/後臺任務的幾種方法的相對優點。異步委託是相當低級的。
我建議您使用基於Task
的方法。這不僅對錯誤處理和返回值等方面提供了最好的支持,而且在async CTP成爲主流時也爲您未來的成功做好準備。如果您有時間,請閱讀Task-Based Asynchronous Pattern文檔 - 它描述了一些仍在開發中的內容,但對於如何設計基於Task
的API有出色的說明。
還要記住Marc關於數據庫連接和線程安全性的警告。您可以使用parallel extensions samples中的任務計劃程序正確訪問數據庫連接,同時保留基於Task
的API。
如果您使用委託人的BeginInvoke
,您有責任確保EndInvoke
被調用。我懷疑ThreadPool
(或者一個自定義的工作隊列/工作線程)將是一個更好的主意。
另一件需要注意的是調用環境;您將無法再訪問有關請求的任何信息,因此必須事先捕獲任何信息(例如,如果進行多租戶,則爲站點)。
細心的線程安全顯然是一個值得關注的問題,但如果沒有具體的例子,就不可能給出具體的警告。
最後;注意數據庫連接;連接不是線程安全的,因此您可能希望確保您的工作人員內部有一個獨立的連接,因爲您無法預測調用上下文中的任何連接正在執行什麼操作;它可以被處置,或者可能正在忙着做某件事。不要使用它。