2011-10-02 50 views
0

我怎樣才能執行2 mysql query使用ThreadingTimer?我想第一次定時器更新數據在db和第二次定時器計數多少數據更新,也顯示在窗體中的標籤。這裏是我的代碼,執行2 MySql查詢使用C#中的計時器

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".我該怎麼辦?有什麼好的建議?

+1

什麼生產線會拋出異常?我的猜測是這是因爲你試圖改變UI中的某些東西,而不是在UI線程上。 –

+0

在TimerAction1中catch拋出exacption @ arkain.So我該怎麼辦? – sumona

+0

它是從MessageBox.Show中拋出嗎?還是隻是在那裏? –

回答

0

在Windows窗體中,除了UI線程以外的其他任何線程都無法在UI中執行任何操作。您的計時器在單獨的線程上運行您的代碼。

您可以嘗試使用System.Windows.Forms.Timer,因爲它會將事件處理重新組織到您的UI線程中。

0

Here you can read about the solution

只是爲了測試它是否修復您的問題嘗試包裝你的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

我在哪寫這段代碼@arkain? – sumona

+0

替換MessageBox.Show(ex.Message);用我寫的方法 –

+0

用你的代碼替換MessageBox.Show(ex.Message)到catch中?它提供了錯誤。 – sumona