我如何每隔5秒检查一次数据库,而不是在C#中冻结gui?

时间:2017-03-16 19:30:02

标签: c# mysql winforms timer background

我正在开发一个需要每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();
    });
}

2 个答案:

答案 0 :(得分:0)

您可以使用Background WorkersThreads。使用 Timer 控件将冻结UI,因为 Timer 控件总是在调用它们的同一个线程上运行!

答案 1 :(得分:0)

据我所知,计时器及其事件工作正常,但数据库的读取操作导致gui延迟。一种选择是使用线程进行读操作:

protected virtual void MyHandler(object sender, args e)
{
new Thread(() => {
myDatabaseObject.QueryForSomething();
}).Start();
}

这可能不是最好的线程方法,但它传达了这个想法。

然后,如果您要查找的内容返回true,可能会在数据库对象中添加一个事件。我希望这种方法不会在gui中出现任何明显的延迟。