在Outlook中添加一個,我有一個工作線程做了一些處理,然後更新布爾標誌。主線程檢查這個標誌,如果這是錯誤的,它只是處理一個while循環而什麼也不做。如何訪問2個線程之間的共享資源?
//worker thread void DoSoneThing() { Outlook.Recipients recps = mail.Recipients. foreach(Outlook.Recipient recp in recps) { //Save each recipients in a colection } isDone=true; } //Main thread while(!isDone) { //read the collection where recipients name have been stored. }``
如果主線程談到這段代碼的工作線程設置標誌爲true,主線程之前不斷處理迴路和secondry線程是正中下懷暫停。並且由於isDone標誌從不設置爲true,所以主線程不會執行任何操作。
當我在DoSomeThing方法中放入一個鎖並在mian線程中使用相同的鎖時,此問題已得到解決。
myClass { public static object _syncRoot = new Object(); void DoSoneThing() { lock(_syncRoot) { //process isDone=true; } } } myOtherClass { lock(myClass._syncRoot) { //process } }
我的理解是鎖用於限制由一個以上的線程的項,以相同的一段代碼。但不明白爲什麼工作線程在共享資源被主線程訪問時沒有做任何事情。
你跳過所有的(但非常值得做的正確的情況下)。重要的邏輯。請發佈Main和DoSomething的實現。 – 2010-06-30 14:02:05