异步数据刷新

时间:2013-07-09 06:29:06

标签: c# asynchronous .net-4.5

我想知道如何做到以下几点。

我有一个控制台应用程序,如下所示:

Data data;

while(true)
{
   // use data for calculations

   if (Timer())
   {
      data = RefreshData();
   }
}
如果自上次Timer()调用后经过的时间等于运行RefreshData()加上五分钟所需的时间,

RefreshData()将返回 true

我希望以相同的周期运行RefreshData(),但是异步,同时使用while循环中的当前数据值,并在RefreshData()完成时将其替换为新值。

3 个答案:

答案 0 :(得分:2)

我建议你这样想:

Timer timer;

public void StartTimer()
{
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    // Set the Interval 
    timer.Interval = 2000;
    timer.Enabled = true;
}

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    data = RefreshData();
}

它会以指定的间隔异步刷新数据。

希望有所帮助

答案 1 :(得分:0)

考虑使用await而不是同步等待Delay任务。这有助于更有效地安排RefreshData

Task.Run( async () =>
{
    while (true)
    {
        await Task.Delay( desiredInterval );
        RefreshData();
    }
});

所有这些说明,您可能想要更改应用程序的设计。您可能希望订阅数据源的更改事件(如果有),而不是定期轮询刷新数据。如果您的数据源是数据库并且您想要缓存最新数据,直到它在数据库中发生更改,您可以考虑使用MemoryCache和适当的缓存策略来过期。

答案 2 :(得分:-1)

using System.Threading.Tasks;

// ...

Data data;

Task.Factory.StartNew(() =>
{
    while (true)
    {
        Task.Delay(5 * 60 * 1000).Wait();
        RefreshData();
    }
}, TaskCreationOptions.LongRunning);

// use data for calculations

考虑使用CancellationToken取消刷新数据。

考虑锁定data以确保线程安全。