在c#中使用定时器执行2个MySql查询
本文关键字:执行 2个 MySql 查询 定时器 | 更新日期: 2023-09-27 18:10:18
我如何使用ThreadingTimer
执行2 mysql query
?我想要第一个定时器在数据库中更新数据,第二个定时器计数有多少数据被更新,并在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".
我该怎么办?有什么好的建议吗?
在Windows窗体中,您不能从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 );
}
这部分是从内存写入的,所以可能会有一点变化。