【问题标题】:Auto refresh using Task使用任务自动刷新
【发布时间】:2015-01-23 16:27:36
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能只使用普通计时器吗?
  • @Koen 我不确定,因为我无法阻止 UI,而且我正在寻找可能的最佳性能
  • 这个任务要做什么,CPU 密集型工作?
  • @YuvalItzchakov 是的,这就是重点!
  • 请包含a good, complete code example。从您的问题中根本不清楚您要做什么。是否有一些计算实际上是连续运行的,并且您希望定期在屏幕上显示结果?还是您只想定期运行计算,然后根据结果更新屏幕?

标签: c# charts .net-4.0 task-parallel-library


【解决方案1】:

您需要自己编写,基于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
}

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

【讨论】:

  • @l3arnon,最初这就是我想要做的......使用TaskTimer 对象。我要测试这种方法.. 谢谢!
【解决方案2】:

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

【讨论】:

  • 是的。我已经检查了 System.Threading.Timer 但我关心的是性能。谢谢
  • 我不确定我是否理解您的意思,如果您使用的是 System.Threading.Timer 而不是 winforms 计时器,您可以通过 GUI 线程处理事情。如果您的意思是“哪个构造更快”,据我所知,它将归结为您正在做的事情,而不是您使用的线程构造。澄清问题?
  • Winforms 有System.Windows.Forms.Timer。它与DispatcherTimer 完全一样,但用于 Winforms。
  • 你确定那个彼得?我的印象 System.Windows.Forms.Timer 只在 GUI 线程上。可以将 DispatchTimer 传递给一个线程来处理。这就是为什么我建议 System.Threading.Timer 允许同样的事情。
  • 对不起......我可能误解了你的意图(但是,这表明答案应该写得更清楚;))。是的,Winforms 计时器事件发生在 GUI 线程中;这就是使用它的原因,这样您就可以执行应该在 GUI 线程中发生的事情。恕我直言,没有理由使用DispatcherTimer,除非还需要在 GUI 线程上执行计时器事件,因此我的推断就是您的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2019-01-07
  • 2013-03-11
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多