2017-12-22 4 views
-1

タイマーでループを作りたいのですが? 私は、あれば内部 をこれらのコードを置けば、それは動作しますが、私はどうすればいいですか?thread.sleepなしでタイマーでアプリケーションを待機させるにはどうすればいいですか?

if (a==true) 
{ 
no color codes 
System.Threading.Thread.Sleep(300); 
green color codes 
System.Threading.Thread.Sleep(300); 
} 

のThread.sleepたくないが、私はのThread.sleep

time = Function.Get_Server_Time(false); 
dServer_Time = time.Rows[0]["ServerDate"].ToDateTime(); 
long msecs = 0; 

if (dTimeDef!= null) 
{ 
msecs = (dServer_Time.Ticks - dTimeDef.Ticks)/10000; 
} 

if (a==true) 
{ 

if (dTimeDef == null || msecs>500) 
{ 
no color 
} 
else 
{ 
green color 
} 
dTimeDef = dServer_Time; 


} 

どのように私はそれを改善することができずに作りたいです。そのようなことはしません

+1

タイマーがすでに存在する場合、コードがスリープ状態または待つ必要はありません。タイマーティックが起きたときにいくつかの操作を行います – ASh

+0

どのようなタイプのUIですか? Windowsフォーム? –

+0

うわーのフォーム。 – mackenzy

答えて

0

await Task.Delay(*time in milliseconds*)を使用できます。 Thisがお手伝いします。

+0

なぜですか?それは 'Thread.Sleep()'よりも何が違うのでしょうか? – Rahul

+0

違いは、 'Thread.Sleep'の間に' await Task.Delay'はスレッドをブロックしないということです – pkuderov

1

あなたの擬似コードに基づいて、私はあなたが遅れが必要とは思わない。 300ミリ秒ごとにイベントを発生させるイベントが必要です。コントロールの1つに色を交互に入れてイベントを処理したいとします。

最も簡単な方法は、このように、System.Windows.Forms.Timerを使用し、300ミリ秒にその間隔を設定することです。また、

private Timer myTimer; 

public void InitTimer() 
{ 
    myTimer = new Timer(); 
    myTimer.Tick += new EventHandler(myTimer_Tick); 
    myTimer.Interval = 300; // in miliseconds 
    myTimer.Start(); 
} 

、私はあなたが、交流などの色を考えていない示唆しています。色を時間の関数として考える。例:あなたは、次に何を現在の色があるべきかを決定するために、この関数の出力を使用することができます

(current milliseconds ÷ 300) mod 2 

:以下の関数は、すべて300ミリ秒を交互に、0または1を返します。これは、現在の色を読み、毎回それをどうするかを決めるよりも、効率的で一貫性があります。

このように、あなたのイベントハンドラは次のようになります。

private void myTimer_Tick(object sender, EventArgs e) 
{ 
    var green = (((float)System.Environment.TickCount/300) % 2) != 0; 
    SetColor(green ? Color.Green : Color.Empty); 
} 
関連する問題