我正在开发一个通过WMI查询服务器状态的应用程序,我被要求让它自动重复,并且它可以对查询进行排队,以便每隔一段时间获取几个服务器的状态。 我遇到的问题是创建第一个计时器时建立的值已经改变了socond的时间(如服务器名称和查询类型)。 这是代码的一部分:
public System.Threading.Timer[] schedquery = new System.Threading.Timer[10];
private void button1_Click(object sender, EventArgs e)
{
schedquery[C3MonitorApp.globalVars.tmrArray] = new System.Threading.Timer(writeLog);
schedValues.schedTurns = 120 / schedValues.schedTimer;
schedquery[C3MonitorApp.globalVars.tmrArray].Change(1000, 0);
C3MonitorApp.globalVars.tmrArray++;
}
public void writeLog(object state)
{
//do queries and write results to file then check if the timer
//has done certain amount of loops and dispose or restart
schedValues.schedTurnCounter++;
if (schedValues.schedTurnCounter == schedValues.schedTurns)
{
this.Dispose();
}
else
{
System.Threading.Timer t = (System.Threading.Timer)state;
t.Change(1000 * 60 * schedValues.schedTimer, 0);
}
}
写日志函数从公共类中获取服务器名称和查询类型,因此我希望以某种方式存储服务器名称这样的值,以便计时器使用原始值而不是用于创建第二个的值来运行回调。 ,第三或第四计时器。
问候。
答案 0 :(得分:1)
传递给计时器的state
对象是传递给构造函数的state
参数。考虑到您的代码没有传递state
参数,我对您的代码完全有用感到有些惊讶。这意味着else
中的代码会因无效的强制转换或空引用异常而失败。
很难说是肯定的,因为你的问题有点模糊,但我认为你想要的是创建一个状态对象并在构造函数中传递它。例如:
class TimerState
{
public string ServerName { get; set; }
public string QueryType { get; set; }
public int TimerIndex { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
schedValues.schedTurns = 120 / schedValues.schedTimer;
var stateObj = new TimerState
{ ServerName = "foo", QueryType = "bar", TimerIndex = C3MonitorApp.globalVars.tmrArray };
schedquery[C3MonitorApp.globalVars.tmrArray] =
new System.Threading.Timer(writeLog, stateObj, 1000, 0);
C3MonitorApp.globalVars.tmrArray++;
}
然后更改writeLog
:
public void writeLog(object state)
{
TimerState stateObj = (TimerState)state;
Timer t = schedquery[stateObj.TimerIndex];
//do queries and write results to file then check if the timer
//has done certain amount of loops and dispose or restart
schedValues.schedTurnCounter++;
if (schedValues.schedTurnCounter == schedValues.schedTurns)
{
t.Dispose();
}
else
{
t.Change(1000 * 60 * schedValues.schedTimer, 0);
}
}
我很确定你不想处置this
。你想要处理计时器,正如我在这里所示。
我可能会遗漏一些关于你的应用程序细节的内容,但上面的内容会给你一般的想法。