2011-05-20 45 views
-1

我的功能是这样的我将使用threading.timer运行此函数,当一个线程锁定myLockHolder内部时,则另一个线程无法进入此锁定,当第一个释放此然后锁再输入&等待执行的线程数我想只有一个内部锁&只有一个等待锁线程池&另一个线程配置工作。定时器锁定属性为只读锁定功能

TimerCallback call = new TimerCallback(reconnect); 
    TimeSpan dueTime = new TimeSpan(0, 0, 0, 0, 2000); 
    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 2000); 
timer1 = new System.Threading.Timer(call, _opcServer, dueTime, interval); 
public void reconnect(object server) 
     {   

      try 
      { 
       lock (myLockHolder) 
       {      
        int i; 
        int groupcnt1 = 0, cntgroup1 = 0; 
        DataSet dsgroup1, ds2; 
        DataTable grpdt1; 
        _opcServer2 = (OpcServer[])server; 
        while (g < _opcServer2.Length) 
        { 
         SrvStatus status; 
         i = _opcServer2[g].GetStatus(out status); 
         if (HRESULTS.Failed(i)) 
         { 
          int j = _opcServer[g].Connect(_opcServer2[g].HostInfo.HostName, _opcServer2[g].ServerName); 
          int id1 = opcconn.getserverID(_opcServer2[g].ServerName, _opcServer2[g].HostInfo.HostName); 
          dsgroup1 = grpclass.getgroupinfo(id1); 

          if (dsgroup1.Tables[0].Rows.Count != 0 && dsgroup1 != null) 
          { 
           grpdt1 = new DataTable(); 
           grpdt1 = dsgroup1.Tables[0].Copy(); 
           foreach (DataRow Row in grpdt1.Rows) 
           { 
            if (groupcnt1 < 128) 
            { 
             if (cntgroup1 < grpdt1.Rows.Count) 
             { 
              ds2 = param.getparameter1(Convert.ToInt32(Row["groupID"])); 
              int timerstart = (Convert.ToInt32(Row["groupID"])) - 1; 
              if (ds2.Tables[0].Rows.Count != 0) 
              { 
               OPCthread(Row, timerstart, g); 

              } 
              groupcnt1++; 
              cntgroup1++; 
             } 
            } 
           } 
          } 

         } 
         cntgroup1 = 0; 
         g++; 
        } 
        if (g == _opcServer2.Length) 
        { 
         g = 0; 
        } 
       } 
      } 
} 

回答

0

里面的你定时器的回调,你应该做两两件事:

1)调用timer1.Adjust,以防止新的回调发生

2)设置一个标志,以便在事件另一在您调整立即返回的计时器之前发生回调。您应该使用与您在回调中进行实际工作时持有的单独锁同步此锁

0

您可以使用Semaphore类来重新访问有限数量的线程,然后您可以使用锁来提供访问有限线程中的一个线程

您可以使用semaphore.WaitOne方法,该方法返回bool以确定线程是应该等待还是应该继续。如果它返回true你可以把你的锁允许一个线程访问你的逻辑

+0

根据你的链接它将只有一个可以访问这个超时没有人等待读写器锁定线程池 – vrushali 2011-05-20 10:27:23

+0

@vrushali认为那是针对我的不是哈里斯。一开始我误解了你的问题,并在一些方向上更新了我的答案,即如何将未完成的定时器回调数保持为1。 – Yaur 2011-05-20 10:31:50