c# - 可移植图书馆中的计时器

标签 c# timer microsoft-metro portable-class-library

我在便携库/Windows 应用商店中找不到计时器。 (针对 .net 4.5 和 Windows Store aka Metro)

有人知道如何创建某种计时事件吗?

我需要某种秒表,所以它应该每秒刷新一次左右

最佳答案

更新:我们已在 Visual Studio 2013 中修复此问题。面向 Store (Windows 8.1) 和 .NET Framework 4.5.1 项目的可移植库现在可以引用 Timer。

这是我们的实现细节泄露给用户的不幸案例。当您仅针对 .NET 4.5 和 Windows 应用商店应用程序时,我们实际上会导致您针对与针对下层平台(.NET 4、SL 4/5、Phone 7.x)时不同的内容进行构建。我们尝试将这两者视为相同,但下面的有限更改开始泄漏(例如 Timer 和 Reflection)。我们在这里介绍了其中的一些内容:http://channel9.msdn.com/Shows/Going+Deep/NET-45-David-Kean-and-Marcea-Trofin-Portable-Libraries .

我们会在未来的版本中解决这个问题。在那之前,您有几个解决方法:

1) 使用 Task.Delay 实现您自己的 Timer 版本,这是我们在内部使用的快速副本:

internal delegate void TimerCallback(object state);

internal sealed class Timer : CancellationTokenSource, IDisposable
{
    internal Timer(TimerCallback callback, object state, int dueTime, int period)
    {
        Contract.Assert(period == -1, "This stub implementation only supports dueTime.");
        Task.Delay(dueTime, Token).ContinueWith((t, s) =>
        {
            var tuple = (Tuple<TimerCallback, object>)s;
            tuple.Item1(tuple.Item2);
        }, Tuple.Create(callback, state), CancellationToken.None,
            TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
            TaskScheduler.Default);
    }

    public new void Dispose() { base.Cancel(); }
}

2) 将您的项目降级为 .NET 4.0 和 Windows 应用商店应用,这将使您能够访问 Timer。

3) 创建一个针对 .NET 4.0 和 Windows Store 应用程序的新项目,并将需要计时器的代码放入其中。然后从 .NET 4.5 和 Windows 应用商店应用程序项目中引用它。

附带说明一下,我已经在 PclContrib 网站上为自己提交了一个工作项目以添加计时器支持:http://pclcontrib.codeplex.com/workitem/12513 .

关于c# - 可移植图书馆中的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12555049/

相关文章:

c# - 使用 XAML C# 删除背景动画?

c# - Unity 5.4 Animator 的动画/状态播放/停止

c# - EF 自定义结果集映射

c# - 在 ASP.net 中禁用日历控件的自动回发

javascript - 在 var 达到特定值后使用 setinterval 执行某些操作?

c# - 如何在处理经过的事件时阻止计时器?

c# - 在 global.asax 中实现自定义错误

c# - 如何以编程方式触发计时器滴答?

c# - 在已完成的事件 Windows 8 App 中从 Storyboard 获取 UIElement

c# - 如何获取当天的 "number"