2017-03-16 48 views
0

我正在開發一個應用程序,需要每5秒檢查一次數據庫(使用查詢),當它發生時,GUI凍結約0.5秒並且它真的很煩人。我怎樣才能每5秒檢查一次數據庫而不是凍結C#中的gui? [已解決]

這是我的代碼,我使用「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

您尚未顯示您的查詢代碼。 – Servy

+0

'myTable'有多大?你真的需要'選擇*'嗎? – EJoshuaS

+0

@EJoshuaS myTable只有一個字段。查詢不是問題,我認爲這是計時器。 – suffuko

回答

0

您可以使用該Background WorkersThreads。使用定時器控件將凍結用戶界面,因爲定時器控件始終在與它們被調用的位置相同的線程上運行!

+1

OP的操作是IO綁定的,而不是CPU綁定的,所以沒有理由創建額外的線程,以便它可以在查詢運行時坐在那裏不做任何事情。 – Servy

+0

哦!我以爲他是要求替代解決方案給定時器控制 – CodeIt

+0

我不明白這個答案有什麼問題。在這裏使用單獨的線程應該沒有問題。 –

0

正如我所理解的問題,計時器和它的事件工作正常,但從數據庫的讀取操作造成gui延遲。一種選擇是使用線程進行讀取操作:

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

這可能不是最好的線程方法,但它傳達了這個想法。

然後,可能會在數據庫對象中添加一個事件,以便在您尋找的任何內容返回時觸發。我希望這種方法不會在gui中引入任何明顯的延遲。

+0

The數據庫操作不會受CPU限制,因此沒有理由創建另一個線程。 – Servy

+0

Servy公平點,但不會主線程在等待IO操作,所以不會使IO異步緩解OP提到的問題?也許異步/等待@EJoshuaS建議?最終,如果異步性不能解決OP的問題,那將會是什麼? –

+0

異步!=多線程。該操作需要是異步的,但完全沒有理由創建另一個線程來完成此操作。 IO本來就是異步的,所以你正在執行異步操作,在發生這種情況時阻塞當前線程,然後創建一個新線程,以便它可以坐在那裏,直到底層異步操作完成。解決方案是隻使用異步操作來開始,而不是創建一個在運行時不執行任何操作的線程。 – Servy

相關問題