Windows Store .NET中的Thread.Sleep替换


98

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

例如这个

System.Threading.Thread.Sleep(1000);

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

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

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

编辑为什么需要延迟:我的应用是游戏,延迟是使计算机对手似乎在“思考”他的下一步行动。该方法已经被异步调用(没有阻塞主线程),我只想减慢响应时间。


2
考虑到Windows Store应用程序不应该能够冻结UI(一切都应该是异步的),因此不支持它是有道理的。
Sruly 2012年

2
您有活动或Monitor课程吗?您可以使用Wait带有超时的方法来模拟睡眠。
帝舵(Tudor)

这是Apptivate.ms吗?:3
EaterOfCode 2012年

3
是的,因为他被放逐Thread.Sleep到不良技术的垃圾箱。
支出者2012年

Answers:


203

Windows Store应用程序具有异步性-并提供了“异步暂停” Task.Delay。因此,在异步方法中,您将编写:

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

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


1
不幸的是,在便携式类库中定位.NET 4.5 + store + WP7时,似乎不支持Task.Delay。
最大

1
@Max:不,因为它在.NET 4.5之前不存在。IIRC,WP7本身没有任何TPL支持。(我可能错了...)
乔恩·斯基特

4
.RunSynchronously()如果需要,您可以坚持。
HappyNomad

1
@RAM:嗯Thread.Sleep 支持.NET 3.5中,这样的问题不适用。毫无疑问,您有一个问题,但这听起来并不像这个问题一样。请阅读tinyurl.com/stack-hints,然后提出一个新问题。
乔恩·斯基特

2
@RAM:我不确定我是怎么想从您的评论中猜测出来的。关于WPF和动画,SO上已经有很多类似的问题。
乔恩·斯基特


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

使用此版本的“苗条”版本。
布兰农

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
我不同意。如果该线程是后台线程并且睡眠时间较短,则使其休眠几毫秒比使用计时器更有效。
杰森·斯蒂尔

1
有时您会被告知要尽一切努力,尽管已建议上述后果的权威人士;)
乔丹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.