私は1秒間隔のタイマーを持っています。毎秒、私はこの機能をOSの最後の入力時間をチェックするために呼びます。関数が返す時間が600(10分)を超えている場合は、DBに書き込む別の関数を呼び出します。機能DBに書き込みません。
DBに1つの行を挿入するのではなく、同じ秒内に多数のレコードが作成されるという問題がここにあります。なぜこれが起こっているのか分かりません。デバッグ時には発生しません。
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);
}
...次のコールが600以下の答えを得るだろうことを、確認してください
lastInputTick
に値を設定することでしたし、DBへの挿入にブレークポイントを置きますそれが3回呼び出されるかどうかを確認します。あなたの関数は別のスレッドで呼び出すことができます。 –ただ可能性:経過したタイマーイベントを3回購読していますか? –
ありがとう、私は今家に帰るときにデバッグします。いいえ、私はイベントに一度だけタイマーを付けました。 –