2017-03-16 3 views
0

DBを5秒ごとに(照会で)チェックする必要があるアプリケーションを開発しています。そのとき、GUIは約0.5秒間フリーズしてしまい、本当に面倒です。どのように私は5秒ごとにdbをチェックすることができますし、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(); 
} 

これを行うより良い方法はありますか?

EDITED: イムこのように、単純なクエリを使用して:

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(); } 

[SOLVED]

さて、私はコメントを読んでいたと私は解決について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には1つのフィールドしかありません。クエリは問題ではない、私はそれがタイマーだと思う。 – suffuko

答えて

0

あなたはそのためBackground WorkersまたはThreadsを使用することができます。 タイマーコントロールを使用すると、タイマーのコントロールは常に呼び出された場所から同じスレッドで実行されるため、UIはフリーズします。

+1

OPの操作はCPUバインディングではなくIOバインドなので、追加のスレッドを作成するだけの理由がないので、クエリが実行されている間は何もしないでください。 – Servy

+0

ああ!私は彼がタイマーコントロールの代替ソリューションを求めていると思った – CodeIt

+0

私はこの答えに間違ったものがどのように表示されないのか分かりません。ここに別のスレッドを使用しても問題はありません。 –

0

私は質問を理解して、タイマーとそのイベントは正常に動作しているが、データベースからの読み取り操作はGUIの遅延を引き起こしています。 1つのオプションは、読み出し動作のためのスレッドを使用することです:

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

これは最高のスレッド方法ではないかもしれないが、それはアイデアを伝えます。

あなたが探しているものが真実ならば、データベースオブジェクトにイベントを追加して起動させることもできます。私は、このアプローチがGUIに顕著な遅延を伴わないことを期待しています。

+0

データベース操作はCPUに束縛されることはなく、別のスレッドを作成する必要はありません。 – Servy

+0

Servyのフェアポイントが、メインスレッドがそのIOオペレーションを待っているわけではないので、IO非同期がOPの問題を解決しないでしょうか? @EJoshuaSが示唆しているように、おそらく非同期/待っていますか?結局のところ、非同期性がOPの問題を解決しない場合、どうなるでしょうか? –

+0

非同期!=マルチスレッドです。操作は非同期である必要がありますが、それを達成するための別のスレッドを作成する理由はありません。 IOはすでに本質的に非同期であるため、非同期操作を実行している間に現在のスレッドをブロックしてから、新しいスレッドを作成して、そこに座って基本の非同期操作が終了するまで何もしないようにします。解決策は、実行中に何もしないスレッドを作成するのではなく、まず非同期操作を使用することです。 – Servy

関連する問題