如何使应用程序线程安全?

时间:2019-05-21 09:03:21

标签: c# multithreading dictionary task

我有一堂课,其职责是连接到设备并执行一些活动。

  • 此类具有名为IDictionary的私有静态localDicttionary成员-用于在deviceidname之间创建映射。
  • 此类具有方法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处理花费更多时间或失败。

0 个答案:

没有答案