C# 函数在不应';T
我有一个间隔为1秒的计时器。每秒钟我都调用这个函数来检查操作系统的最后一次输入时间。如果函数返回的时间超过600(10分钟),我调用另一个函数将内容写入数据库 这里的问题是,函数将在同一秒内创建多个记录,而不是在数据库中插入一行。我不知道为什么会这样。调试时不会发生这种情况C# 函数在不应';T,c#,sql,C#,Sql,我有一个间隔为1秒的计时器。每秒钟我都调用这个函数来检查操作系统的最后一次输入时间。如果函数返回的时间超过600(10分钟),我调用另一个函数将内容写入数据库 这里的问题是,函数将在同一秒内创建多个记录,而不是在数据库中插入一行。我不知道为什么会这样。调试时不会发生这种情况 public void elapsedGetIdleCount(object source, ElapsedEventArgs e) { uint result = GetLastInputTime(
public void elapsedGetIdleCount(object source, ElapsedEventArgs e)
{
uint result = GetLastInputTime();
if (result >= 600)
{
result = 0;
tmrIdle.Stop();
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"C:/Users/" + Environment.UserName + "/AppData/Roaming/3CXPhone for Windows/3CXPhone.xml");
var element = xDoc.SelectSingleNode("Accounts/Profiles/Profile/AuthUser");
var extension = element.InnerText.ToString();
SetQueueStatus("LoggedOUT", "Inactivity");
DialogResult mb = MessageBox.Show("You have been Logged Out of the Queues due to inactivity!", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
if (mb == DialogResult.OK)
{
ChangeQueueStatusColor();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
public void SetQueueStatus(string status, string eventDesc)
{
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"C:/Users/" + Environment.UserName + "/AppData/Roaming/3CXPhone for Windows/3CXPhone.xml");
var element = xDoc.SelectSingleNode("Accounts/Profiles/Profile/AuthUser");
var extension = element.InnerText.ToString();
string conString = "Data Source = lewcomp1\\COMPLIANCE; Initial Catalog = ComplianceData; Integrated Security = True";
using (SqlConnection myCon = new SqlConnection(conString))
{
using (SqlCommand myCMD = new SqlCommand())
{
myCMD.Connection = myCon;
myCMD.CommandText = "UPDATE eData SET QueueStatus = '" + status + "', Extension = '" + extension + "' WHERE UserName LIKE '" + lblUserName.Text + "';";
SqlDataReader myReader;
myCon.Open();
myReader = myCMD.ExecuteReader();
myReader.Read();
myCon.Close();
myCMD.CommandText = "INSERT INTO eQueueData (Date_Time, UserName, Extension, EventID, EventDesc) VALUES ('" + DateTime.Now + "','" + lblUserName.Text + "','" + extension + "','" + status + "','" + eventDesc + "');";
myCon.Open();
myReader = myCMD.ExecuteReader();
myReader.Read();
myCon.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
static uint GetLastInputTime()
{
uint idleTime = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
uint envTicks = (uint)Environment.TickCount;
if (GetLastInputInfo(ref lastInputInfo))
{
uint lastInputTick = lastInputInfo.dwTime;
idleTime = envTicks - lastInputTick;
}
return ((idleTime > 0) ? (idleTime / 1000) : 0);
}
从您的代码中,我很确定这个例程被调用了好几次。可能的原因:
- 事件的多重中止
- 有几个地方称之为独立
另一个想法是为您的
lastInputTick
设置一个值,以确保下一次调用将从您的代码中得到低于600的应答…,我很确定,此例程被调用了多次。可能的原因:
- 事件的多重中止
- 有几个地方称之为独立
另一个想法是为您的
lastInputTick
设置一个值,以确保下一次调用得到的答案低于600…您最好的办法是调试并在数据库中插入一个断点,然后查看它是否被调用3次。您的函数可能会在不同的线程上调用。只是可能:您订阅了3次运行计时器事件吗?谢谢各位,我现在回家后会调试。不,我只在事件上附加了一次计时器。最好的办法是调试并在DB中插入一个断点,看看它是否被调用了3次。您的函数可能会在不同的线程上调用。只是可能:您订阅了3次运行计时器事件吗?谢谢各位,我现在回家后会调试。不,我只在活动上附加了一次计时器。谢谢您的反馈。我没有使用静态标志。你介意进一步解释吗?嗯,旗帜总是有点难看,应该避免,但是:因为你正在处理一个强制注销,我认为在这种情况下这是可以的。在您拥有静态uint GetLastInputTime()
的地方,您可以放置一个公共静态bool forcedShutton
。在检查>=600
后输入代码块时,将此标志设置为true。在您的GetLastInputTime
中,您使用类似if(forcedShutton)的方法返回0代码>。您可以在finally
块中将此设置为false以处理可能的错误…感谢您的响应和帮助。我会尽快测试。谢谢你的反馈。我没有使用静态标志。你介意进一步解释吗?嗯,旗帜总是有点难看,应该避免,但是:因为你正在处理一个强制注销,我认为在这种情况下这是可以的。在您拥有静态uint GetLastInputTime()
的地方,您可以放置一个公共静态bool forcedShutton
。在检查>=600
后输入代码块时,将此标志设置为true。在您的GetLastInputTime
中,您使用类似if(forcedShutton)的方法返回0代码>。您可以在finally
块中将此设置为false以处理可能的错误…感谢您的响应和帮助。我会尽快测试这个。