1

我想知道如何执行以下操作。

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

Data data;

while(true)
{
   // use data for calculations

   if (Timer())
   {
      data = RefreshData();
   }
}

Timer()如果自上次调用以来经过的时间等于运行时间加上五分钟,则返回true 。RefreshData()RefreshData()

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

4

3 回答 3

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();
}

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

希望有帮助

于 2013-07-09T06:42:30.127 回答
0

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

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

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

于 2013-07-09T07:22:29.040 回答
-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线程安全。

于 2013-07-09T06:51:33.367 回答