Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数在不应';T_C#_Sql - Fatal编程技术网

C# 函数在不应';T

C# 函数在不应';T,c#,sql,C#,Sql,我有一个间隔为1秒的计时器。每秒钟我都调用这个函数来检查操作系统的最后一次输入时间。如果函数返回的时间超过600(10分钟),我调用另一个函数将内容写入数据库 这里的问题是,函数将在同一秒内创建多个记录,而不是在数据库中插入一行。我不知道为什么会这样。调试时不会发生这种情况 public void elapsedGetIdleCount(object source, ElapsedEventArgs e) { uint result = GetLastInputTime(

我有一个间隔为1秒的计时器。每秒钟我都调用这个函数来检查操作系统的最后一次输入时间。如果函数返回的时间超过600(10分钟),我调用另一个函数将内容写入数据库

这里的问题是,函数将在同一秒内创建多个记录,而不是在数据库中插入一行。我不知道为什么会这样。调试时不会发生这种情况

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以处理可能的错误…感谢您的响应和帮助。我会尽快测试这个。