LeoAndo / xamarin-forms-training

traning for Xamarin.Forms
0 stars 1 forks source link

タイマーのサンプル #22

Open LeoAndo opened 3 years ago

LeoAndo commented 3 years ago

Device.StartTimer(TimeSpan, Func) メソッド を使うパターン https://github.com/LeoAndo/xamarin-forms-training/pull/24

LeoAndo commented 2 years ago

プラットフォームに依存しないタイマー: 非同期処理

XamarinのViewModelは特定のプラットフォームに依存する作りにすべきでないため、Xamarin.Forms固有のタイマー処理であるDevice.StartTimer(TimeSpan, Func) メソッド をViewModelで直接使うのは良い方法とは言えない。

なので、Task.Delayを使ってタイマー処理を行う方が良い。Task.Delayは.Netの一部でありこちらの方がはるかにプラットフォームから独立しているからです。

サンプル

コード解説 https://github.com/LeoAndo/xamarin-forms-training/blob/main/TaskDelayClock/TaskDelayClock/TaskDelayClock/MainPage.xaml.cs#L16:L36

InfiniteLoopメソッドが、通常のメソッドであるかのようにコンストラクターから呼び出されることに注目してください。 このメソッドにTask.DelayではなくThread.Sleepを使用した場合は、いつまで経ってもコンストラクターに制御が戻らず、コンストラクターが終わらなくなってしまいます。このInfiniteLoopメソッドは、await演算子を最初に検出した時点でコンストラクターに制御を戻すため、コンストラクターが実行を終了できます。 プログラムでは他の作業を実行できますが、InfiniteLoopメソッドの実行が再開する250ミリ秒ごとにUIスレッドが要求されます。