2016-06-21 114 views
0

我想創建自定義類的實例。例如,我有兩個線程T1T2。如果我從T1創建實例,則從T2對該實例的任何訪問都應引發異常。就像在WinForms中一樣,當我嘗試從不是UI線程的線程訪問控制時。如果調用線程不是創建對象的線程,則拋出異常

如何實現這一目標?我應該存儲對current thread的引用,還是應該保留當前線程的unique ID? (如果該ID存在)。我使用哪種機制?

基本上它會是一個單一的生成給定種子的隨機數字。我想阻止從其他線程訪問這個單例,因爲我需要用相同的種子再次運行我的應用程序來重現我的場景。如果我願意從其他線程使用這個類,那麼複製將是不可能的,因爲線程以不可預測的順序啓動/停止/執行動作。

+0

爲什麼?爲什麼不修復代碼以保證線程安全?在返回隨機數的方法中,一個簡單的'lock(){..}'應該足夠了 –

+0

http://stackoverflow.com/a/7610982/574632 – Steve

+0

如果您只想訪問,則不需要單例該對象來自主窗體或單個對象。 –

回答

3

我想你可以用Thread.CurrentThread.ManagedThreadId來達到這個目的。

但是,請注意,這些ID可能會在某個時間重新使用,因此它們在您的應用程序的使用期限內可能不是唯一的。但是,鑑於你所描述的情況,我認爲這不應該是一個問題。

此外,您需要注意的是,根據使用方式和位置的不同,您的「警衛」可能無法在異步編碼方面表現良好。

+0

如果ManagedThreadId可以重用,那對我來說並不好。但是我會在主線程上創建我的類,所以它會工作。但存儲引用是好還是不好? – zgnilec

+0

好吧,任何32位ID可能會在長時間運行的應用程序中隨着時間的推移重新使用。此外,你有線程池可以重新使用線程(然後保持相同的ID當然)。所以這很大程度上取決於情況。在任何時候,沒有兩個ID可能會發生衝突,因此,假如「已授權」線程處於活動狀態,其他線程不會同時獲得管理標識,那麼在您的情況下重用不應成爲問題。 。 – Lucero

+0

目前即時存儲在我的Initialize()方法中的Thread.CurrentThread的私有字段引用。我有一些重要的方法,我有這樣的事情:lock(...){if(Thread.CurrentThread!= savedThreadReference)拋出新的InvalidOperationException(「Cross-thread ...」);好嗎? – zgnilec

相關問題