【问题标题】:WinRT Replacement of System.Environment.TickCountWinRT 替换 System.Environment.TickCount
【发布时间】:2012-04-29 02:59:17
【问题描述】:

System.Environment.TickCount 的 WinRT 替代品是什么?

【问题讨论】:

  • 你需要它做什么?对于许多用途,DateTime.UtcNow 非常好,但并不等同。
  • 如果您需要单调时间,DateTime.UtcNow 不是替代品。 UtcNow 是一个任意值。
  • TickCount 也是一个任意值。 DateTime.UtcNow.Tick 是单调的。
  • @Hans Passant,如果用户调整时间,UtcNow 可以向后跳。 Env.TickCount 是单调的。这个问题实际上导致了 ManualResetEventSlim 的超时实现中的错误,我报告了该错误并已修复。当用户更改时钟时间时,超时突然过去或从未过去。
  • 嗯,这通常需要显式调用 CultureInfo.ClearCachedData。很高兴该错误已修复:)

标签: c# timer windows-8 windows-runtime


【解决方案1】:

它应该可用,因为它是isn't a problem。但它不是,我猜是 [TypeForwardedTo] 挂断,因为 GetTickCount() 不在白名单上,而且 .NET 从未采用 GetTickCount64。标准回退工作正常,您可以使用 pinvoke 调用本机 Windows 函数。我验证了使用它的程序通过了 Windows 应用认证工具包测试。

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern long GetTickCount64();

请注意,它返回的是 long,而不是 int。如果这在 C# 中很重要,您可以简单地转换为 int 来截断(但不是 vb.net,只是谎报返回类型)

【讨论】:

  • 所以我很困惑。如果 Metro 应用程序允许它们,那么为什么默认情况下它不存在于 C# API 中?
  • 我试图在答案中解释它。不要射信使,我更喜欢解决问题的答案。
  • 是的,对不起。我不是故意对你竖琴的。我想知道这是否会随着最终版本而改变。不过还是谢谢。
  • 注意,此代码将使您的 WinRT 应用程序无法在 ARM 上运行
【解决方案2】:

Windows 8 Windows 商店应用现在似乎支持 System.Environment.TickCount。

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2012-11-05
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多