11

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

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

有什么要找的资源吗?

4

3 回答 3

34

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

// 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
}
于 2013-01-12T19:40:04.840 回答
12

你需要使用Timer类。有多个内置计时器,这取决于使用哪个计时器的要求。

  1. System.Timers.Timer:这个更适合多线程访问。此计时器的实例是线程安全的。

  2. System.Threading.Timer:此计时器的实例不是线程安全的。

  3. System.Windows.Threading.DispatcherTimer -> 它将事件发送到Dispatcher线程(并且不是多线程的)。如果您需要更新 UI,这很有用。

  4. System.Windows.Forms.Timer -> 此计时器在 UI 线程中引发事件。这是针对 Windows 窗体优化的,不能在 WPF 中使用。

以下是有趣的阅读。
比较 .NET Framework 类库中的计时器类

于 2013-01-12T18:41:59.787 回答
2

如果您希望该方法在与 UI 线程不同的线程上执行,请使用System.Threading.Timer. 否则(但我不认为这是你的情况),使用System.Windows.Threading.DispatcherTimer.

于 2013-01-12T18:39:06.623 回答