我有一堂课,其职责是连接到设备并执行一些活动。
IDictionary
的私有静态localDicttionary
成员-用于在deviceid
和name
之间创建映射。此类具有方法StartWorkItem
,其方法是检查字典中是否已存在deviceid
,否则将其添加到字典中。
class DeviceManager
{
bool isBusy;
private IDictionary<string, string> localDicttionary = new Dictionary<string, string>();
public bool StartWorkItem()
{
if (!LocalDictionary.ContainsKey(id))
{
LocalDictionary.Add(id, stationName);
}
//do some action which makes isBusy=true/false
}
public static IDictionary<string, string> LocalDictionary
{
get
{
return workstaionmapperDictionary;
}
set
{
workstaionmapperDictionary = value;
}
}
public bool IsBusy()
{
return isBusy;
}
}
我们有一个队列,其中包含要逐一处理的设备详细信息列表
workQueue = new Queue<WorkItem>();
现在,我已经创建了DeviceManager
的实例来处理此workQueue
。已创建3个实例,因此如果manager
之一繁忙,则可以将处理移交给下一个实例。
dManager= new DeviceManager[3];
for (int ii = 0; ii < dManager.Count(); ++ii)
{
dManager[ii] = new DeviceManager(this);
}
for (int ii = 0; ii < dManager.Count(); ++ii)
{
if (dManager[ii].IsBusy())
continue;// go to next manager and assign him a task
if (workQueue.Count > 0)
{
WorkItem item = workQueue.Dequeue();
if (!dManager[ii].StartWorkItem(item))
{
}
}
}
问题是,代码可以正常工作,但是我认为它不是线程安全的。如何使它线程安全?
更新
单词thread safe
令人困惑。要求是:网络上有1000多个设备,我们希望连接每个设备并更新它为property
之一。我们有com
库,用于更新属性。连接到设备有时会失败还是成功取决于设备的电源(开/关)。因此我们希望继续处理集合中的next
设备,即使last
处理花费更多时间或失败。