2011-06-06 134 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