Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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# 在C中使用计时器执行2个MySql查询_C#_Mysql_Winforms_Timer - Fatal编程技术网

C# 在C中使用计时器执行2个MySql查询

C# 在C中使用计时器执行2个MySql查询,c#,mysql,winforms,timer,C#,Mysql,Winforms,Timer,如何使用ThreadingTimer执行2 mysql查询?我希望第一次更新数据库中的数据,第二次计算更新的数据量,并在windows窗体的标签中显示。这是我的代码 void PrepareTimers(List<int> _dataValues) { foreach (int dataValue in _dataValues) { timer = new ThreadingTimer (new TimerCallb

如何使用ThreadingTimer执行2 mysql查询?我希望第一次更新数据库中的数据,第二次计算更新的数据量,并在windows窗体的标签中显示。这是我的代码

   void PrepareTimers(List<int> _dataValues)
   {
        foreach (int dataValue in _dataValues)
        {
            timer = new ThreadingTimer (new TimerCallback(TimerAction), dataValue, 0, 2000);
            timer1 = new ThreadingTimer(new TimerCallback(TimerAction1), dataValue, 0, 2000);

            //Console.WriteLine("Timer " + dataValue + " created.");


        }
    }
    void TimerAction(object flag)
    {
        //Console.WriteLine("Timer start "+ flag.ToString());
        string myconstring = "SERVER=localhost;" + "DATABASE=alicosms;" + "UID=root;" + "PASSWORD=;";
        MySqlConnection mycon = new MySqlConnection(myconstring);
        string u = "UPDATED";
        mycon.Open();
        //Console.WriteLine("Timer " + flag.ToString() + " : " + "UPDATE sms_data_bankasia set flag= @flag * 2 , sendingstatus = '" + u + "' WHERE flag = " + flag.ToString() + "  LIMIT 1");
        MySqlCommand cmd = new MySqlCommand("UPDATE sms_data_bankasia set flag= @flag * 2 , sendingstatus = '" + u + "' WHERE flag = " + flag.ToString() + " LIMIT 1", mycon);
        MySqlParameter param = new MySqlParameter();
        param.ParameterName = "@flag";
        param.Value = flag;
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
        mycon.Close();                                  
    }

    void TimerAction1(object flag)
    {
        string myconstring = "SERVER=localhost;" + "DATABASE=alicosms;" + "UID=root;" + "PASSWORD=;";
        MySqlConnection mycon = new MySqlConnection(myconstring);
        string sql = "SELECT count(flag) FROM sms_data_bankasia where sendingstatus='UPDATED' group by flag";
        MySqlCommand comd = mycon.CreateCommand();
        comd.CommandText = sql;
        mycon.Open();
        MySqlDataReader dtr = comd.ExecuteReader();
        try
        {
            while (dtr.Read())
            {
                dict[timer] = label;
                dict[timer].Text = dtr[0].ToString() + " program Updated";
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        mycon.Close();
    } 

它提供错误,跨线程操作无效。我该怎么办?有什么好的建议吗?

在Windows窗体中,除了UI线程之外,您不能在UI中执行任何其他线程。 计时器正在一个单独的线程上运行代码

您可以尝试改用System.Windows.Forms.Timer,因为它会为您将事件处理封送回UI线程

只是为了测试它是否解决了您的问题,请尝试用如下代码包装MessageBox调用:

public delegate void StringDelegate(string message);

private void ShowMessageBox( string message )
{
    if (this.InvokeRequired)
    {
        this.Invoke( new StringDelegate( ShowMessageBox, new object[] { message } ));
        return;
    }

    MessageBox.Show( message );
}

这部分内容是从内存中写入的,因此可能会有一些变化。

哪一行会引发该异常?我猜这是因为你试图在UI中而不是在UI线程上更改某些内容。在TimerAction1 catch中,抛出exacption@arkain。那么我该怎么办?它是从MessageBox中抛出的。显示?或者它只是在那里被捕获?它被抛出到MessageBox@arkainReplace MessageBox.Showex.Message中;使用我编写的方法,将MessageBox.Showex.Message替换为代码捕获?它提供错误。什么错误,您需要更具体,请记住我是从内存编写的,如果有编译器错误,您可能必须更改它。我不清楚您的代码。为此,我不明白我在哪里做了更改以避免编译器错误我做了一个更改,这样做行吗?但实际上,你只需要看看哪些参数是可能的,我不记得了,也不能检查它。它只是一个普通的委托,如果你更喜欢的话,你甚至可以让它匿名。看看我发送的链接,它会更详细地解释。