c# - 如何使用线程或计时器从 WPF 客户端应用程序定期执行方法

标签 c# wpf multithreading timer client-applications

<分区>

我正在开发一个 WPF 客户端应用程序。这个应用程序定期向 webservice 发送数据。当用户登录到应用程序时,我希望每 5 mts 运行一次特定方法以将数据发送到 .asmx 服务。

我的问题是我是否需要使用线程或计时器。此方法的执行应该在用户与应用程序交互时发生。 即在此方法执行期间不阻塞 UI

有什么资源可以找吗?

最佳答案

我会推荐使用新的 async/await 关键字的 System.Threading.Tasks 命名空间。

// The `onTick` method will be called periodically unless cancelled.
private static async Task RunPeriodicAsync(Action onTick,
                                           TimeSpan dueTime, 
                                           TimeSpan interval, 
                                           CancellationToken token)
{
  // Initial wait time before we begin the periodic loop.
  if(dueTime > TimeSpan.Zero)
    await Task.Delay(dueTime, token);

  // Repeat this loop until cancelled.
  while(!token.IsCancellationRequested)
  {
    // Call our onTick function.
    onTick?.Invoke();

    // Wait to repeat again.
    if(interval > TimeSpan.Zero)
      await Task.Delay(interval, token);       
  }
}

然后你只需在某处调用这个方法:

private void Initialize()
{
  var dueTime = TimeSpan.FromSeconds(5);
  var interval = TimeSpan.FromSeconds(5);

  // TODO: Add a CancellationTokenSource and supply the token here instead of None.
  RunPeriodicAsync(OnTick, dueTime, interval, CancellationToken.None);
}

private void OnTick()
{
  // TODO: Your code here
}

关于c# - 如何使用线程或计时器从 WPF 客户端应用程序定期执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296644/

相关文章:

wpf - Prism 4 WPF App - 实现了 MVVM、存储库和工作单元模式的解决方案架构

c# - 自定义LiveChart中单个数据的颜色

c++ - 通过连接 QObject 使用 std::future

c# - 拒绝访问一个类中的文件夹,但不访问另一个类中的文件夹

c# - 用两个标准排序,字符串升序,整数升序

wpf - DataGrid.RowStyle 仅适用于初始绑定(bind)

objective-c - 读取串行数据时 CPU 消耗和延迟较高

c# - 当失败的原因不重要时,捕获 System.Exception 是一种好的形式吗?

c# - 从 UML 类图生成代码

asp.net - 此 ObjectBuilder 代码中是否存在线程安全问题?