web-dev-qa-db-ja.com

UIにリンクされていないUWPアプリのタイマー

私はUWP MVVMプロジェクトに取り組んでおり、ユーザーの対話が特定の時間停止した場合に自動ログアウトシステムを実装したいと考えています。
今までDispatcherTimerを使用して、毎秒200から後方にカウントします。

TimerLeave = 200;
var _dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);

_dispatcherTimer.Start();

しかし、DispatcherTimerはUIとリンクされており、MVVMアプリを構築しているため、代替手段を探しています。
少し検索して、 タイマーでバックグラウンドタスクを実行 を見つけました。問題は、このタイマーは15分ごとに実行するようにしか設定できないことです。これは、私の場合、ユーザーを自動的にログアウトするには少し長すぎます。 15分を短縮する回避策は見つかりませんでした。
だから私の質問は、UIにリンクされておらず、変数を設定できるUWPプロジェクトにタイマーを設定する可能性はありますか?

15
croxy

はい-たとえば Timer class を使用できます-ただし、別のスレッドで実行されることを覚えておく必要があります。例:

private Timer timer;
public MainPage()
{        
    this.InitializeComponent();
    timer = new Timer(timerCallback, null, (int)TimeSpan.FromMinutes(1).TotalMilliseconds, Timeout.Infinite);
}

private async void timerCallback(object state)
{
    // do some work not connected with UI

    await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () => {
            // do some work on UI here;
        });
}

UIディスパッチャにディスパッチされた作業はすぐには処理されない場合があります-ディスパッチャのワークロードに依存します。

また、このタイマーはアプリと一緒に実行され、アプリが中断されると機能しなくなることを忘れないでください。

20
Romasz

ThreadPoolTimer クラスを使用してこの問題を最近解決しました。

ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer((t) =>
        {
            //do some work \ dispatch to UI thread as needed
        }, TimeSpan.FromMinutes(1));

現時点では、既に投稿されているTimerソリューションに対するこの利点の認識はありませんが、うまく機能しています。

10
Saxar

あなたのコードは正しいかもしれませんが、上記のブログを参照した後、dispacherタイマーの代わりにthreadpoolタイマーを使用しました。

アプリのディスパッチャタイマーを使用していた初期レベルについて話すと、実際に何が起こるかは、2日間の連続スタンバイ後にハングします。このブログで言及しているスレッドプールタイマーについて考えましたが、スレッドプールではわずか5〜6時間でハングしました。

私の経験では、ディスパッチャタイマーはスレッドプールタイマーよりも望ましいと思います。

それを使った私の経験です。

0
siddharth