执行函数后周期性函数完成其任务(Executing a function periodically

2019-07-20 03:26发布

我建立使用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:刷新功能执行(花费的任何时间量)

步骤2:刷新功能完成其执行

第3步:天窗的15分钟,然后转到步骤1

刷新功能执行。 15分钟的执行结束后,再次执行。

Answer 1:

的的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分钟,执行正常进行。



Answer 2:

我认为,一个更简单的方式来做到这与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 ,其可以用于检测错误。



文章来源: Executing a function periodically after the function completes its task