2013-02-19 51 views
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:刷新功能执行(花费的任何时间量)

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

步骤3:间隙为15分钟然后转到步骤1

刷新功能执行。执行完15分钟后,再次执行。

回答

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分钟,则执行过程将正常进行。

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

相关问题