trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

PCLにおけるタイマーを実装する。

直接的にXamarinやMvvmCrossと関係ないのですが、PCLにおいてタイマーを使う方法がわからなかったので、ネットで調べつつ実装してみました。
一応、以下が完成品になります。突っ込みどころがあれば教えていただけると幸いです。
しばらく様子を見て落ち着いたら、コードレシピにこのタイマーを使ったサンプルを上げる予定です。

/// <summary>
/// 定期的に処理を実行するタイマークラス
/// </summary>
public class Timer : CancellationTokenSource, IDisposable
{
    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="action">実行するアクション</param>
    /// <param name="state">継続アクションによって使用されるデータを表すオブジェクト</param>
    /// <param name="dueTime">最初の実行までに遅延する時間(ミリ秒)</param>
    /// <param name="period">アクションを実行する間隔(ミリ秒)</param>
    /// <param name="ts">CancellationTokenSourceオブジェクト</param>
    public Timer(Action<Object> action, object state, int dueTime, int period, CancellationTokenSource cts)
    {
        Task.Delay(dueTime, cts.Token).ContinueWith(
        async (t, s) =>
        {
            var tuple = (Tuple<Action<Object>, object>)s;

            while (! cts.IsCancellationRequested)
            {
                await Task.Run(() => tuple.Item1(tuple.Item2), cts.Token);
                await Task.Delay(period);
            }
        },
        Tuple.Create(action, state),
        CancellationToken.None,
        TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
        TaskScheduler.Default);
    }

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

◆参考にさせていただいたサイト

Timer in portable class library
http://stackoverflow.com/questions/20445041/timer-in-portable-class-library

#まだいろいろわからないことはたくさんたくさんあるけれど、着実に開発を進めていこうと思います。