99

.NET 似乎不支持 Windows 应用商店应用程序中的Thread.Sleep 。

例如,这个

System.Threading.Thread.Sleep(1000);

将在针对任何 .NET Framework(2.0、3.5、4.0、4.5)时编译,但在针对 Windows 应用商店应用程序的 .NET(或在同时针对 4.5 和商店的可移植类库中)时不会编译。

System.Threading.Thread 仍然存在,只是没有 Sleep 方法。

我需要在我的应用程序中延迟几秒钟,有合适的替代品吗?

编辑为什么需要延迟:我的应用程序是一个游戏,延迟是为了让它看起来像计算机对手正在“考虑”他的下一步行动。该方法已经被异步调用(主线程没有被阻塞),我只是想减慢响应时间。

4

5 回答 5

203

Windows 应用商店应用程序包含异步 - 并且“异步暂停”由Task.Delay. 所以在异步方法中,你会写:

await Task.Delay(TimeSpan.FromSeconds(30));

...或任何你想要的延迟。异步方法将在 30 秒后继续,但线程不会被阻塞,就像所有await表达式一样。

于 2012-09-28T13:48:39.827 回答
46

讨厌说明显的,但万一有人想要一条线System.Threading.Tasks.Task.Delay(3000).Wait()

于 2014-11-03T19:23:16.660 回答
20

我刚刚遇到了同样的问题,并找到了另一个有趣的解决方案,我想与您分享。如果您真的想阻止线程,我会这样做(感谢@Brannon 的“苗条”提示):

// `waitHandle.Set` is never called, so we wait always until the timeout occurs
using (var waitHandle = new ManualResetEventSlim(initialState: false))
{
    waitHandle.Wait(TimeSpan.FromSeconds(5));
}
于 2013-05-04T12:29:47.223 回答
11

MainPage.xaml.cs

public MainPage()
{
  this.InitializeComponent();
  this.WaitForFiveSeconds();
}

private async void WaitForFiveSeconds()
{
  await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
  // do something after 5 seconds!
}
于 2012-10-08T20:41:30.233 回答
-7

几乎没有理由(除了测试目的)使用Thread.Sleep().

如果(且仅当)您有充分的理由将线程发送到睡眠状态,您可能需要检查Task.Delay(),您可以等待“等待”指定时间。尽管让线程闲置而不做任何事情从来都不是一个好主意。坏习惯...

于 2012-09-28T13:48:34.343 回答