更新:我们已在 Visual Studio 2013 中修复此问题。面向 Store (Windows 8.1) 和 .NET Framework 4.5.1 项目的可移植库现在可以引用 Timer。
这是我们的实现细节泄露给用户的不幸案例。当您仅针对 .NET 4.5 和 Windows Store 应用程序时,我们实际上会让您针对某些不同的东西进行构建,而不是针对低级平台(.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 Store 应用程序,这样您就可以访问 Timer。
3) 创建一个面向 .NET 4.0 和 Windows Store 应用程序的新项目,并将需要计时器的代码放入其中。然后从 .NET 4.5 和 Windows 应用商店应用项目中引用它。
作为旁注,我已经在 PclContrib 网站上为自己提交了一个工作项以添加计时器支持:http://pclcontrib.codeplex.com/workitem/12513。