【问题标题】:Thread.Sleep replacement in .NET for Windows Store.NET for Windows Store 中的 Thread.Sleep 替换
【发布时间】:2012-09-20 09:50:45
【问题描述】:

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

比如这个

System.Threading.Thread.Sleep(1000);

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

System.Threading.Thread 还在,只是没有 Sleep 方法。

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

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

【问题讨论】:

  • 考虑到 Windows 应用商店应用程序不应该能够冻结 UI(一切都应该是异步的)它不受支持是有道理的。
  • 您有活动或Monitor 类吗?您可以使用Wait 方法和超时来模拟睡眠。
  • 这是 Apptivate.ms 的吗? :3
  • 很高兴将 Thread.Sleep 驱逐到坏技术的垃圾箱。

标签: c# .net windows-store windows-store-apps


【解决方案1】:

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

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

【讨论】:

  • 我不同意。如果线程是后台线程并且睡眠时间很短,那么让它睡眠几毫秒比使用计时器更有效。
  • 有时你被告知要这样做,尽管你已经告知了权威人物的后果;)
【解决方案2】:

Windows 应用商店应用支持异步 - Task.Delay 提供了“异步暂停”。所以在异步方法中,你会写:

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

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

【讨论】:

  • 不幸的是,在可移植类库中以 .NET 4.5 + store + WP7 为目标时,似乎不支持 Task.Delay。我想我会将它移到平台特定的类中。
  • @Max:不,因为它在 .NET 4.5 之前不存在。 IIRC,WP7 本身没有任何 TPL 支持。 (我可能是错的......)
  • 如果需要,您可以添加.RunSynchronously()
  • @RAM:嗯Thread.Sleep 支持.NET 3.5,所以这个问题不适用。毫无疑问,您有 a 问题,但听起来与此问题不同。请阅读tinyurl.com/stack-hints,然后提出一个新问题。
  • @RAM:我不确定我是如何从你的 cmets 中猜测的。关于 WPF 和动画的 SO 已经有很多类似的问题。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我刚刚遇到了同样的问题,并找到了另一个有趣的解决方案,我想与您分享。如果您真的想阻止线程,我会这样做(感谢@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));
    }
    

    【讨论】:

    • 这是可移植编码的最佳答案。
    • 使用这个的“slim”版本。
    【解决方案5】:

    不愿说出显而易见的事实,但万一有人想要一行System.Threading.Tasks.Task.Delay(3000).Wait()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2014-11-03
      • 2019-11-12
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多