C# 使用任务自动刷新

C# 使用任务自动刷新,c#,charts,.net-4.0,task-parallel-library,C#,Charts,.net 4.0,Task Parallel Library,我有一个winforms应用程序,其中有一个图表组件工作得很好,现在我需要实现一个自动刷新机制,因此图表将在用户在运行时设置的时间范围内不断更新(30段,1分钟,…)。 我正在搜索如何使用Task来获取此信息,但我注意到该任务没有计时器 那么,你已经做过类似的事情了吗?什么听起来是最好的方法?线程?幕后工作者 我的项目是.NET 4.0,我无法修改它。在WPF中,我们有DispatchTimer,但遗憾的是,我不认为您可以在WinForms中使用它们。您可以使用System.Threading.

我有一个winforms应用程序,其中有一个图表组件工作得很好,现在我需要实现一个自动刷新机制,因此图表将在用户在运行时设置的时间范围内不断更新(30段,1分钟,…)。 我正在搜索如何使用Task来获取此信息,但我注意到该任务没有计时器

那么,你已经做过类似的事情了吗?什么听起来是最好的方法?线程?幕后工作者


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

在WPF中,我们有DispatchTimer,但遗憾的是,我不认为您可以在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
来指示它何时应该停止。这将返回一个任务,您可以在最后等待,以确保没有任何未处理的异常:

// 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 wait
,使用你就不能使用普通计时器吗?@Koen我不确定,因为我无法阻止用户界面,而且我正在寻找可能的最佳性能。这项任务将做什么,CPU受限的工作?@YuvalItzchakov是的,这就是重点!请包括。你的问题根本不清楚你想做什么。是否有一些连续运行的计算,并且您希望定期在屏幕上显示计算结果?或者您只是想定期运行计算,然后根据结果更新屏幕?是的。我已经检查过System.Threading.Timer,但我关心的是性能。谢谢我不确定我是否理解你的意思,如果你使用的是System.Threading.Timer而不是winforms Timer,那么你可以在GUI线程之外处理事情。如果你的意思是“哪种构造更快”,就我所知,这将取决于你在做什么,而不是你使用哪种线程构造。关于这个问题的澄清?Winforms有
System.Windows.Forms.Timer
。它与Dispatchermer完全相同,但与Winforms不同。peter,你确定吗?我的印象是System.Windows.Forms.Timer仅在GUI线程上。DispatchTimer可以被传递一个线程来处理。这就是为什么我建议System.Threading.Timer允许同样的事情。抱歉…我可能误解了您的意图(但是,这会建议答案应该写得更清楚;)。是的,Winforms定时器事件发生在GUI线程中;这就是使用它的原因,这样您就可以执行GUI线程中应该发生的事情。恕我直言,除非还需要在GUI线程上执行计时器事件,否则没有理由使用
Dispatchermer
,因此我推断这就是你的意思。@l3arnon,最初我是想这么做的。。将
任务
计时器
对象一起使用。我将测试这种方法。。谢谢