2016-07-08 4 views
-4

私は、メインスレッド以外の2つのスレッドを使用しているクライアントアプリケーションを作成しました。バックグラウンドスレッドは、受信後に別のスレッドを呼び出すときにTCP IPを通じてデータを受信するために使用されます。私はThread.sleep(30000)を使用していますが、なぜ動作していないのか、時にはスリープモードから復帰するのを知っていません。 30秒前に。ドットネットフレームワークを使用しています。4.他の選択肢を提案してください。Thread.sleep()を使用しない時間遅延

for(n=0;n<=m;n++) 
{ 
    //show data; 
    //wait for 30 seconds 
} 
+0

。 'Task.Delay'や' Thread.Sleep'が気に入らなければ、あなたはDateTimeとLoopを使ってあなた自身を書くことさえできます。 'Timer'クラスもあります。これはあなたを助けるかもしれません。 – Jannik

+1

*何も表示しない*どのように* 30秒待つと、何が間違っているかを知っていると思いますか?予想される動作を示さないコードに関する問題がある場合は、**コードを投稿してください。 – nvoigt

+0

私が言ったように、私はThread.Sleep()を使っていました。私のコードは〜のように見えました(n = 0; n <= m; n ++) { //データを表示します。 Thread.Sleep(30000); } –

答えて

3

.NETではタイマーが正確ではありません。正確に30000を得ることはできません。

Thread.Sleep(30000を使用できます。またはawait Task.Delay(30000)ですが、方法をasyncとマークする必要があります。

違いは、Thread.Sleepは現在のスレッドをブロックしますが、Task.Delayはブロックしません。

public async Task MyMethod() 
{ 
    int n; 
    int m = 100; 

    for(n=0; n<=m; n++) 
    { 
     //show data; 
     //wait for 30 seconds 
     await Task.Delay(30000); 
    } 
} 

.NET 4の場合、あなたはこのalternativeを使用することができます:あなたは、いくつかのオプションを持っている

public static Task Delay(double milliseconds) 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Elapsed += (obj, args) => 
    { 
     tcs.TrySetResult(true); 
    }; 
    timer.Interval = milliseconds; 
    timer.AutoReset = false; 
    timer.Start(); 
    return tcs.Task; 
} 
+0

私はFramework 4でTask.Delay()を使用していますが、フレームワーク4.5ではTask.Delay()が使用されています –

+0

@SubhodeepBhattacharjee編集を確認してください – user3185569

+0

これは完璧に働いてくれてありがとうございます。 much :) –

関連する問題