[英]Threading in C#
我有控制台應用程序。 在這種情況下,我有一些過程可以通過不同的層(業務和數據訪問)從數據庫中獲取數據。 將獲取的數據存儲在各個對象中。 就像為學生獲取數據一樣,該數據將存儲(分配給)Student對象。 學校也一樣。 然后他們委托一個調用特定方法,該方法根據要求生成輸出。 此過程將執行多次,例如10次。 好? 我想同時運行此過程。 沒有一個會開始,它將結束,然后第二個會開始。 我要在開始第1個進程之后,僅要開始第2個,第3個......第10個。 意味着它應該是多線程的。 我怎樣才能做到這一點? 在打開和關閉數據庫連接時會給我錯誤嗎? 我已經嘗試過這個概念。 但是當線程1'st開始時,將為線程1提取數據,並將其存儲在其各自的(學生,學校)對象中。 好? 當同時的第2個線程啟動時,但第1個對象的數據正在改變,而控制在程序中流動。 該怎么辦?
這是一些示例代碼:
static void Main(string[] args)
{
for (int i=0; i<10; i++)
System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(DbWork));
}
public void DbWork(object state)
{
// Call your database code here.
}
看一下ThreadPool類。 它應該將您放置在正確的位置,以便輕松處理多線程應用程序
是的,這將需要多線程,但我認為這是第一次嘗試的不佳選擇。 多線程很復雜,需要您“不學習”從過程編程中獲得的一些知識。 同時連接到同一數據庫引擎的數據庫連接使此問題變得更加復雜,這可能會也可能不會提高您的性能。
看看.NET 4.0中的並行編程 。 尤其是並行任務庫使您可以很好地控制對可能相互依賴的不同任務進行線程化。
該鏈接將幫助您:
您可以使用線程修改此解決方案,您將獲得所需的結果。 http://dotnetacademy.blogspot.com/2010/02/multiple-active-result-sets-mars-in-sql.html
您需要為每個線程實例化每個類的新實例。 如果對數據庫的每個調用都在修改第一次調用中的數據,則您引用的是同一實例。 多線程被認為是“高級話題”,如果可能的話,您可能希望找到另一種方法來解決此問題。
這可能會有所幫助!
啟動一個作為主線程的線程,該線程依次調用所有線程1,2,3 ....並執行此邏輯以控制主線程
主線程啟動..
線程1如果是第一次啟動則啟動,或者如果不是第一次啟動則重新啟動,則暫停t1
開始t2是第一次,如果不是第一次則恢復t2
t2工作完成t2暫停
t3開始或恢復為先處理條件
以此類推
主線程將控制所有線程的順序,並暫停和恢復它們
嘗試這個,
除非您了解機制和內在問題,否則不應實施多線程解決方案。
就是說,當您感覺已准備好轉向並行算法時,請使用稱為APM(異步編程模型)的模式,在該模式中產生工作線程,並讓它們通過回調方法(即事件委托)通知主線程。
Jeffrey Richter解釋: 實現CLR異步編程模型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.