我想知道如何做到以下几点。
我有一个控制台应用程序,如下所示:
Data data;
while(true)
{
// use data for calculations
if (Timer())
{
data = RefreshData();
}
}
如果自上次Timer()
调用后经过的时间等于运行RefreshData()
加上五分钟所需的时间, RefreshData()
将返回 true 。
我希望以相同的周期运行RefreshData()
,但是异步,同时使用while循环中的当前数据值,并在RefreshData()
完成时将其替换为新值。
答案 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
以确保线程安全。