6

C# と xaml を使用して Windows ストア アプリを作成しています。一定時間後にデータを更新する必要があります(サーバーから新しいデータを取得します)。ThreadPoolTimer を使用して、次のように更新機能を定期的に実行しました。

   TimeSpan period = TimeSpan.FromMinutes(15); 
   ThreadPoolTimer PeriodicTimer =  ThreadPoolTimer.CreatePeriodicTimer(async(source)=> {  
   n++; 
   Debug.WriteLine("hello" + n);
   await dp.RefreshAsync(); //Function to refresh the data
   await Dispatcher.RunAsync(CoreDispatcherPriority.High,
                () =>
                {
                    bv.Text = "timer thread" + n;

                });

        }, period);

これは正常に動作しています。唯一の問題は、次のインスタンスがスレッド プールに送信される前に更新機能が完了しない場合です。その実行間のギャップを指定する方法はありますか。

ステップ 1 : Refresh 関数が実行されます (任意の時間がかかります)

ステップ 2 : Refresh 関数の実行が完了する

ステップ 3 : 15 分間のギャップの後、ステップ 1 に進みます

リフレッシュ機能が実行されます。実行が終了してから 15 分後に、再度実行されます。

4

2 に答える 2

6

AutoResetEventはこの問題を解決します。クラス レベルの AutoResetEvent インスタンスを宣言します。

AutoResetEvent _refreshWaiter = new AutoResetEvent(true);

次に、コード内で次のようにします。1.シグナルが送信されるまで待機し、2.その参照を引数として RefreshAsync メソッドに渡します。

TimeSpan period = TimeSpan.FromMinutes(15); 
   ThreadPoolTimer PeriodicTimer =  ThreadPoolTimer.CreatePeriodicTimer(async(source)=> {  
   // 1. wait till signaled. execution will block here till _refreshWaiter.Set() is called.
   _refreshWaiter.WaitOne();
   n++; 
   Debug.WriteLine("hello" + n);
   // 2. pass _refreshWaiter reference as an argument
   await dp.RefreshAsync(_refreshWaiter); //Function to refresh the data
   await Dispatcher.RunAsync(CoreDispatcherPriority.High,
                () =>
                {
                    bv.Text = "timer thread" + n;

                });

        }, period);

最後に、dp.RefreshAsyncメソッドの最後で_refreshWaiter.Set();、15 秒が経過した場合に次の RefreshAsync が呼び出されるように呼び出します。RefreshAsync メソッドにかかる時間が 15 分未満の場合、実行は通常どおり進行することに注意してください。

于 2013-02-19T06:31:32.620 に答える
4

これを行う簡単な方法は次のとおりだと思いますasync

private async Task PeriodicallyRefreshDataAsync(TimeSpan period)
{
  while (true)
  {
    n++; 
    Debug.WriteLine("hello" + n);
    await dp.RefreshAsync(); //Function to refresh the data
    bv.Text = "timer thread" + n;
    await Task.Delay(period);
  }
}

TimeSpan period = TimeSpan.FromMinutes(15); 
Task refreshTask = PeriodicallyRefreshDataAsync(period);

このソリューションは、Taskエラーの検出に使用できる も提供します。

于 2013-02-19T12:27:49.500 に答える