выполнить 2 MySql-запроса, используя таймер в C # - PullRequest
0 голосов
/ 02 октября 2011

Как я могу выполнить 2 mysql query, используя ThreadingTimer? Я хочу, чтобы данные первого таймера обновлялись в дБ, а счетчик второго таймера - сколько данных обновлено, а также отображается в метке в форме 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();
    } 

Это обеспечивает error,"cross thread operation not valid". Что мне делать?Любое хорошее предложение?

Ответы [ 2 ]

0 голосов
/ 02 октября 2011

Здесь вы можете прочитать о решении

Просто чтобы проверить, решит ли это вашу проблему, попробуйте заключить вызов 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 );
}

Это частично записано из памяти, поэтому может немного отличаться.

0 голосов
/ 02 октября 2011

В формах Windows вы не можете ничего делать в пользовательском интерфейсе из какого-либо другого потока, кроме пользовательского.Ваш таймер запускает ваш код в отдельном потоке.

Вместо этого вы можете попробовать использовать System.Windows.Forms.Timer, поскольку он перенаправит обработку событий обратно в поток пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...