2016-07-08 79 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

谢谢主席先生,这一个完美工作..谢谢很多:) –