2014-04-15 51 views
0

我需要組織一些鎖定當多個線程在未來的代碼架構可以訪問共享資源:C#多線程與DLL(反射)

有一個DLL什麼都有它們的方法(標有一些屬性)通過外部程序進行反思調用。所有這些方法都由該外部程序的幾個線程同時調用。 在這個方法裏面,我們引用了其他方法,它們位於另一個dll中。在另一個我們有其他DLL的方法。 外部運行程序 - (反射)> DLL - > DLL - > DLL

一切順利,直到那一刻,當所有線程開始走在鏈中的最後一個DLL使用相同的資源(訪問郵箱)。 一個嘗試刪除郵件,但另一個已經刪除它等。實際上,我不關心它,如果郵件不存在,可以放入try/catch,但我不想使用此解決方案。

我在考慮添加一些鎖來讀取和刪除操作,並使這種刪除異步方式(我不關心結果,不需要等到它將完成 - 只是清理舊消息),並使用一些代碼如下

lock(someObject) 
{ 
    //Access to email and delete old messages 
} 

但someObject必須在該體系結構(外部運行程序)的頂層聲明,並且此參數必須被認爲是所有鏈。很多工作,我不想這樣做。

此外,我可以把這個鎖在頂部程序什麼運行dll方法,但需要做很多更改,因爲我會失去很多時間,因爲我只能鎖定小部分而不是全部。

其他建議?

回答

3

體系結構建議將創建一個訪問郵件資源的操作隊列,以避免鎖定。這將會失去對調用者的反饋,但如果需要可以異步完成。可能只是刪除階段必須排隊,這取決於你想要做的確切工作。當然,這樣的隊列必須是安全的,並且取決於你想要的可靠性水平,可以是一個持續隊列(如MSMQ)

1

我認爲只要有線程間的順序沒有依賴關係(一個線程創建消息,另一個線程添加附件)。在這種情況下,Felice Pollano提到的Queue可能是一個很好的解決方案。

最後,無論您是否鎖定,您都需要處理衝突。如果這些衝突是可預測的,你可以使用鎖定,否則嘗試抓住可能會很好。