PCL 定时器更改功能

PCL Timer Change function

我查看了 Timer in Portable Library,但我不知道如何调用 Change 函数,因为它没有在 class 中实现,也没有从父级继承。

_timer = new Timer(OnTimerTick, null, TimeSpan.FromSeconds(1.0), TimeSpan.Zero);
_timer.Change(TimeSpan.FromSeconds(1.0), TimeSpan.Zero); //how to implement this

我现在使用他的第三个解决方案,而不是使用第一个解决方案:(构建 class 计时器),由 David Kean 提供:(创建一个目标 .NET 4.0 计时器适配器)以及 Henry 的代码示例C.

无论如何,我仍然希望得到一些关于如何在 .NET 中定义的定时器 class 中实现 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();
    }
}

我开发了一个支持库,其中包含 PCL 中缺失或不完整的类型。该库名为 Shim and is also available on NuGet

Shim 针对不同的平台目标有不同的实例。如果您安装 Shim 形式 NuGet,它将为您的 Visual Studio 项目选择相关实例,无论是可移植的 class 库,Windows 8 应用程序或 Xamarin.Android class 库。

Shim包含一个System.Threading.Timer的声明,包括两个构造函数和Change(int, int)方法。当使用来自 Windows 8 应用程序或 class 库的 Shim 时,有一个 Windows 8 specific 实现使用 Windows.System.Threading.ThreadPoolTimer [=41= 】 内部。对于其他(非PCL)平台目标,[TypeForwardedTo] 声明用于将调用转发到该特定目标的现有实现。

一些一般的实现细节可以在 this SO answer 中找到。如果您不想要完整的 Shim 包的开销,您可以使用此 SO 答案中提供的方法自己实现必要的部分。