使用任务自动刷新

Auto refresh using Task

我有一个带有图表组件的 winforms 应用程序工作得很好,现在我需要实现一个自动刷新机制,这样图表将在 运行 时间内在用户设置的时间范围内持续更新(30 段,1 分钟,...)。 我正在搜索如何使用 Task 来获取它,但我注意到 Task 没有计时器。

所以,你有没有做过类似的事情?什么听起来最好?线程?后台工作人员?

我的项目是.NET 4.0,无法修改。

在 WPF 中,我们有 DispatchTimers,但遗憾的是我认为您不能将它们与 WinForms 一起使用。您可以使用 System.Threading.Timer(可以在 GUI 线程之外使用)和在准备好更新时对 GUI 线程进行某种调用来做一些聪明的事情。这会是您需要做的事情吗?

您需要自己编写,基于 Task.Delay(内部使用 System.Threading.Timer)创建一个在特定时间后完成的任务:

async Task AutoRefresh(TimeSpan interval, CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        RefreshChart();
        await Task.Delay(interval);
    }
}

您可以在启动时以特定的时间间隔调用它,并在它应该停止时发出 CancellationToken 信号。这将 return 您可以在最后 await 完成一项任务,以确保您没有任何未处理的异常:

// start
var interval = GetIntervalFromUser();
_cts = new CancellationTokenSource();
_autoRefreshTask = AutoRefresh(interval, cts.Token);

// end
_cts.Cancel();
try
{
    await _autoRefreshTask;
}
catch (Exception e)
{
    // handle exception
}

您可以在 .Net 4.0 中使用 async-awaitMicrosoft.Bcl.Async nuget