我的功能是这样的我将使用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;
}
}
}
}
根据你的链接它将只有一个可以访问这个超时没有人等待读写器锁定线程池 – vrushali 2011-05-20 10:27:23
@vrushali认为那是针对我的不是哈里斯。一开始我误解了你的问题,并在一些方向上更新了我的答案,即如何将未完成的定时器回调数保持为1。 – Yaur 2011-05-20 10:31:50