Update:我们已在 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)时不同的东西进行构建。我们尝试将这两者视为相同,但底层的有限更改开始泄漏(例如计时器和反射)。我们在这里介绍其中的一些内容:http://channel9.msdn.com/Shows/Going+Deep/NET-45-David-Kean-and-Marcea-Trofin-Portable-Libraries 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 应用商店应用程序,这将使您能够访问计时器。
3)创建一个针对.NET 4.0和Windows Store应用程序的新项目,并将需要计时器的代码放入其中。然后引用 .NET 4.5 和 Windows 应用商店应用程序项目中的内容。
作为旁注,我已在 PclContrib 网站上为自己提交了一个工作项目以添加计时器支持:http://pclcontrib.codeplex.com/workitem/12513 http://pclcontrib.codeplex.com/workitem/12513.