我已经检查了Timer in Portable Library,但我不知道如何调用Change函数,因为它没有在类中实现,也没有从父类继承。
_timer = new Timer(OnTimerTick, null, TimeSpan.FromSeconds(1.0), TimeSpan.Zero);
_timer.Change(TimeSpan.FromSeconds(1.0), TimeSpan.Zero); //how to implement this
答案 0 :(得分:1)
不是使用David Kean的第一个解决方案:(构建类Timer),而是使用他的第三个解决方案:(使用Henry C的代码示例创建一个目标.NET 4.0 Timer适配器)。
无论如何,我仍然希望得到一些关于如何在.NET中定义的Timer类中实现Change函数的反馈。谢谢!
public class PCLTimer
{
private System.Threading.Timer timer;
private Action<object> action;
public PCLTimer(Action<object> action, object state, int dueTimeMilliseconds, int periodMilliseconds)
{
this.action = action;
timer = new System.Threading.Timer(PCLTimerCallback, state, dueTimeMilliseconds, periodMilliseconds);
}
public PCLTimer(Action<object> action, object state, TimeSpan dueTimeMilliseconds, TimeSpan periodMilliseconds)
{
this.action = action;
timer = new System.Threading.Timer(PCLTimerCallback, state, dueTimeMilliseconds, periodMilliseconds);
}
private void PCLTimerCallback(object state)
{
action.Invoke(state);
}
public bool Change(int dueTimeMilliseconds, int periodMilliseconds)
{
return timer.Change(dueTimeMilliseconds, periodMilliseconds);
}
public bool Change(TimeSpan dueTimeMilliseconds, TimeSpan periodMilliseconds)
{
return timer.Change(dueTimeMilliseconds, periodMilliseconds);
}
public new void Dispose()
{
timer.Dispose();
}
}
答案 1 :(得分:1)
我开发了一个支持库,其中包含PCL中缺少或不完整的类型。该库名为Shim,也可在NuGet上找到。
Shim 针对不同的平台目标提供不同的实例。如果您安装 Shim 表单 NuGet ,它将为您的Visual Studio项目选择相关实例,无论是可移植类库,Windows 8应用程序还是Xamarin.Android类库。
Shim 包含System.Threading.Timer
的声明,包括两个构造函数和Change(int, int)
方法。在Windows 8应用程序或类库中使用 Shim 时,内部使用Windows.System.Threading.ThreadPoolTimer
类进行Windows 8 specific实现。对于其他(非PCL)平台目标,[TypeForwardedTo]
声明用于将调用转发到此特定目标的现有实现。
可以在this SO回答中找到一些常规实施细节。如果您不想要完整 Shim 包的开销,您可以使用本SO答案中提供的方法自行实现必要的部分。