定时器锁定属性为只读锁定功能

本文关键字:锁定 功能 只读 属性 定时器 | 更新日期: 2023-09-27 17:56:57

我的函数像这样,我将使用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;
                    }
                }
            }
}

定时器锁定属性为只读锁定功能

在计时器回调中,您应该做两件事:

1) 呼叫定时器1。调整以防止发生新的回调

2) 设置一个标志,以便在调整计时器之前发生另一个回调时,回调立即返回。 您应该将其与在回调中执行实际工作时持有的锁分开的锁同步

您可以使用

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

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