使用任务自动刷新
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-await
和 Microsoft.Bcl.Async
nuget
我有一个带有图表组件的 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-await
和 Microsoft.Bcl.Async
nuget