2011-10-24 25 views
0

私はC#(Visual Studio)で書かれたプログラムを持っています。これはトレイ上で動作します。 10分ごとに1つのアクションを実行します。 私は今のコードを次ています C#で非同期の一時停止を行うには?

while(true) 
{ 
Thread.Sleep(10000); 
// my stuff 
} 
をしかし、それは動作しません。それはプログラムをフリーズする。

+1

さて、あなたは分ではなく10秒間スリープします。 'Sleep'メソッドはパラメータとして_milliseconds_の数をとります。だから、10分間寝たいなら 'Sleep(600000)'と書いてください。 –

答えて

6

タイマーオブジェクトを使用し、whileループを作成しないでください。

System.Timers.Timer _timer = new System.Timers.Timer(); 
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); 
//30 seconds 
_timer.Interval = 30000; 
_timer.Start(); 

private void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    //do your logic 
} 
+0

System.Timers.Timerクラスではなく、System.Threading.Timerクラスを使用することをお勧めします。ジェフリー・リヒターのちょっとした話。 –

+0

どういう違いがありますか? –

+0

下記のリンクは、それらの違いを示しています http://social.msdn.microsoft.com/forums/en/US/csharpgeneral/thread/656f8b0f-77f7-42a7-a34c-0325ffef6c0a –

2

Thread.Sleepは、Xの時間のためにスリープ状態になっています。このスレッドがフロントエンドスレッド(メッセージの処理を担当するスレッド)である場合、スレッドを再び起動してメッセージを処理するまで、イベントを処理するメッセージや再描画メッセージはハンドリングされないため、実際にはアプリケーションをフリーズします。

このロジックは10秒ごとにスケジュールする必要があります。

フォームにタイマーをドロップし、10秒ごとに実行するように指定します。 Tickイベント内で、カスタムアクションを呼び出します。

1

Thread.Sleepは現在のスレッドを「停止」します。スレッドが1つだけの場合、すべてが一時停止されます。

達成したいことは何ですか?

おそらく、あなたが第二のスレッド、または多分よりよい解決策は10分ごと

のアクションをトリガーするタイマーを必要とします。 Task.StartNew()またはThreadPool