定时器锁定属性为只读锁定功能
本文关键字:锁定 功能 只读 属性 定时器 | 更新日期: 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
您可以放置锁以允许一个线程访问您的逻辑