2012-08-30 130 views
0

我有一個遞歸函數,產生幾個異步任務。每個任務都會更新一個常用字典對象我可以通過引用傳遞一個鎖對象嗎?

我可以與其他線程共享鎖對象作爲函數中的參數嗎?

public class RecursiveTest 
{ 

    void DoRecursiveWork(ref object myDictLock, dictionary<string,string> myDict) 
    { 
    // yadda.. async code that calls DoRecursiveWork() 

    } 

} 
+0

當你嘗試時會發生什麼? – Dai

+2

我不明白你爲什麼不能這樣做,但是這有點讓我覺得這是一個糟糕的設計。誰負責鎖定或解鎖?如果一個功能忘記釋放鎖定會怎麼樣? – mpen

+0

@Mark DoRecursiveWork函數在退出前始終會鎖定並釋放鎖定。 – LamonteCristo

回答

3

假設你打算做這樣的事情

// do something 
lock (myDictLock) { 
    // access the dictionary 
} 
// do something else 

可以「參照」或「價值」(即通過引用傳遞的對象的引用或值的參考,因爲object是參考類型)。在這兩種情況下,鎖定對象都會起作用。當您通過引用傳遞時,您也可以分配遞歸鏈頂部傳遞的變量,儘管我懷疑這是您計劃要做的事情。

+0

+1。如果希望將鎖對象與要保護的對象分開更換,確實聽起來很奇怪。 –

+0

我想在同一時間在不同的線程中運行我的遞歸函數的3個實例。這意味着我需要3次鎖和字典的實例,這將會被多次調用。你看到這個設計有什麼問題嗎? – LamonteCristo

+0

@AlexeiLevenkov我見過很多關於MSDN和SO的建議,以便使用並非我正在使用的實際變量的專用Lock對象。我爲此採用了variableName + Lock的約定 – LamonteCristo