在Windows Store中,.NET中的Thread.Sleep替代方法是什么?

99

Thread.Sleep 在 .NET for Windows Store 应用中似乎不被支持。

例如,以下代码

System.Threading.Thread.Sleep(1000);

可以针对任何 .NET Framework(2.0、3.5、4.0、4.5)编译,但不能针对 .NET for Windows Store 应用程序(或针对同时定位 4.5 和存储库的可移植类库)。

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

我需要在我的应用程序中延迟几秒钟,是否有合适的替代方法?

编辑原因: 我的应用程序是一个游戏,延迟是为了让计算机对手看起来像在“思考”他的下一步棋。该方法已经异步调用(主线程未被阻塞),我只是想减缓响应时间。


2
考虑到 Windows Store 应用程序不应该冻结用户界面(一切都应该是异步的),因此不支持此功能是有道理的。 - Sruly
2
你是否拥有事件或Monitor类?你可以使用带有超时的Wait方法来模拟睡眠。 - Tudor
这是为Apptivate.ms吗? :3 - EaterOfCode
3
庆幸Thread.Sleep被彻底抛弃,不再是落后技术的代表。 - spender
5个回答

203

Windows Store应用程序支持异步操作,通过Task.Delay提供“异步暂停”。因此,在异步方法中,您需要编写以下代码:

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

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


1
不幸的是,在可移植类库中,当针对.NET 4.5+存储+WP7进行目标定位时,Task.Delay似乎不受支持。我想我必须将其移入特定于平台的类中。 - Max
1
@Max:不,因为它在.NET 4.5之前不存在。如果我没记错的话,WP7本身没有任何TPL支持。(我可能错了...) - Jon Skeet
4
如有需要,您可以添加.RunSynchronously() - HappyNomad
1
@RAM:嗯,.NET 3.5确实支持Thread.Sleep,所以这个问题并不适用。毫无疑问,您有一个问题,但它似乎与这个问题不同。请阅读http://tinyurl.com/stack-hints,然后提出一个新的问题。 - Jon Skeet
2
@RAM:我不确定我应该如何从你的评论中猜出来。关于WPF和动画,SO上已经有很多类似的问题了。 - Jon Skeet
显示剩余5条评论

46

恕我直言,但如果有人想要一行代码来延迟执行,请使用以下代码:System.Threading.Tasks.Task.Delay(3000).Wait()


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));
}

这是便携式编码的最佳答案。 - zezba9000
请使用“slim”版本。 - Brannon

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!
}

-7

几乎没有任何理由(除了测试目的),永远不要使用 Thread.Sleep()

如果你有非常好的理由需要让线程休眠,你可能想检查一下 Task.Delay(),它可以等待指定时间。虽然让一个线程闲置无事可做从来都不是一个好主意。这是一种不良的做法……


9
我不同意。如果线程是后台线程且睡眠时间很短,则让其睡眠几毫秒比使用计时器更高效。 - Jason Steele
1
有时候,即使你向权威人士提出后果的建议,你仍然被告知要这样做 ;) - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接