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