我正在开发一个需要每5秒检查一次数据库的应用程序(带有查询),当它发生时,GUI会冻结大约0.5秒并且它真的很烦人。
这是我的代码,我正在使用" System.Windows.Forms.Timer"但我可以改变它。
private void TimerBackground(Object myObject, EventArgs eventArgs)
{
// code to check from DataBase that takes about 0.5 sec and freezes the GUI
// Then it will display the result to a label in a form
}
void main(){
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Tick += new EventHandler(TimerBackground);
myTimer.Interval = 5000;
myTimer.Start();
}
有更好的方法吗?
编辑: 我使用一个简单的查询,如下所示:
string credentials = "Server=127.0.0.1;port=3306;Database=test;Uid=root;password=root;";
MySqlConnection conn = null;
try
{
conn = new MySqlConnection(credentials);
MySqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT * FROM myTable;";
conn.Open();
MySqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
//...
}
}
catch { }
finally { if (conn != null)conn.Close(); }
[解决]
好吧,我正在阅读评论,我决定调查解决我问题的await
。
我只是在我的"定时器功能"中写了这个。 (TimerBackground):
private async void TimerBackground(Object myObject, EventArgs eventArgs)
{
// This prevents the GUI from freezing.
await Task.Run(() =>
{
runQueryFunction();
});
}
答案 0 :(得分:0)
您可以使用Background Workers或Threads。使用 Timer 控件将冻结UI,因为 Timer 控件总是在调用它们的同一个线程上运行!
答案 1 :(得分:0)
据我所知,计时器及其事件工作正常,但数据库的读取操作导致gui延迟。一种选择是使用线程进行读操作:
protected virtual void MyHandler(object sender, args e)
{
new Thread(() => {
myDatabaseObject.QueryForSomething();
}).Start();
}
这可能不是最好的线程方法,但它传达了这个想法。
然后,如果您要查找的内容返回true,可能会在数据库对象中添加一个事件。我希望这种方法不会在gui中出现任何明显的延迟。