我有一个winforms应用程序,图表组件工作得很好,现在我需要实现自动刷新机制,因此图表将在用户在运行时设置的时间范围内连续更新(30 segs,1 min ,...)。 我正在搜索如何使用Task来获取此信息,但我注意到任务没有计时器。
那么,你有没有做过类似的事情?听起来最好的方法是什么?主题? BackgroundWorker的?
我的项目是.NET 4.0,我无法对其进行修改。
答案 0 :(得分:0)
您需要自己编写,基于Task.Delay
(内部使用System.Threading.Timer
)创建在一定时间后完成的任务:
async Task AutoRefresh(TimeSpan interval, CancellationToken token)
{
while (!token.IsCancellationRequested)
{
RefreshChart();
await Task.Delay(interval);
}
}
您可以在启动时使用特定时间间隔调用它,并使用CancellationToken
发出信号以指示何时应该停止。这将返回您最后await
的任务,以确保您没有任何未处理的例外:
// start
var interval = GetIntervalFromUser();
_cts = new CancellationTokenSource();
_autoRefreshTask = AutoRefresh(interval, cts.Token);
// end
_cts.Cancel();
try
{
await _autoRefreshTask;
}
catch (Exception e)
{
// handle exception
}
您可以使用Microsoft.Bcl.Async
nuget
async-await
答案 1 :(得分:-1)
在WPF中我们有DispatchTimers,但遗憾的是我不认为你可以在WinForms中使用它们。您可以使用System.Threading.Timer(可以在GUI线程之外使用)做一些聪明的事情,并在准备好更新它时对GUI线程进行某种调用。这会是你需要做的事吗?