2011-06-06 100 views
2

我有一個應用程序用於讀寫數據到不同的存儲位置。存在包含多個存儲設備的存儲池的概念。一次只能有一個設備可用於寫入內容。事實上池中的第一個存儲設備被認爲是活動的。一旦它變滿或無法訪問,下一個設備應該變爲活動狀態。管理多線程存儲池

我有一個類ProviderManager與以下接口。

public class DeviceManager 
{ 
     public StorageDevice CurrentDevice {get; private set;} 
     public bool MoveNext() { // get device on next index } 
} 

的問題是,我們進入下一個設備時,纔會有一個例外,這意味着其要麼填充或無法訪問。可能會出現多線程無法在設備上寫入的情況,並且每個線程都會調用DeviceManager.MoveNext(),而不是僅由其中一個線程調用它。

雖然,我可以管理它,但涉及一些骯髒的工作。尋找一個很好的方式來管理這個。

您的想法?

回答

4

如何

public bool MoveNext(StorageDevice oldDevice) 

只要MoveNext的是線程安全的,只是如果Current == oldDevice改變前檢查。

0
MoveNext() 
{ 
    if(Current.isAccessible) 
     return; 
    <....> 
} 
當然MoveNext的呼叫

應該是同步的

0

爲什麼你甚至暴露MoveNext給調用者?根據你的描述,我認爲DeviceManager應該負責處理錯誤和轉移到下一個設備。

是否有某種方式可以讓DeviceManager攔截寫入異常?

+0

DeviceManager被稱爲StorageAdapter的另一個類使用。由StorageAdapter在DeviceManager.Current上調用所有讀取和寫入操作。因此,如果有任何異常,MoveNext必須由StorageAdapter調用。 – Sumee 2011-06-06 09:46:31