2016-07-08 101 views
-4

我寫了一個客戶端應用程序,其中使用了除主線程之外的兩個線程。後臺線程用於通過TCP IP接收數據,而在接收到後我調用另一個線程將使用for循環連續顯示接收到的數據。但每次迭代後,for循環需要等待30秒。我使用了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來寫你自己的遊戲。還有'定時器'類,這可能會幫助你。 – Jannik

+1

沒有*任何*表示*如何*你等待30秒,你期望我們知道什麼是錯的?如果您在代碼中沒有顯示預期行爲方面的問題,請發佈代碼**。 – nvoigt

+0

正如我所說我在那裏使用了Thread.Sleep()。我的代碼看起來像 - for(n = 0; n <= m; n ++) {show data; 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

我無法使用Task.Delay(),因爲我使用.Net Framework 4,而Task.Delay()用於框架4.5 –

+0

@SubhodeepBhattacharjee檢查編輯 – user3185569

+0

謝謝主席先生,這一個完美工作..謝謝很多:) –