Как периодически выполнять метод из клиентского приложения WPF с помощью потоковой обработки или таймера

Я разрабатываю клиентское приложение WPF. Это приложение периодически отправляет данные в webservice. Когда пользователь регистрируется в приложении, я хочу запустить конкретный метод каждые 5 мс для отправки данных в службу .asmx.

Мой вопрос в том, нужно ли мне использовать потоки или таймер. Это выполнение метода должно происходить во время взаимодействия пользователя с приложением. то есть без блокировки пользовательского интерфейса во время выполнения этого метода

Любые ресурсы для поиска?

Ответ 1

Я бы рекомендовал пространство имен 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
}

Ответ 2

Вам нужно использовать класс Timer. Существует несколько встроенных таймеров, и это зависит от требования, которое использует таймер.

  • System.Timers.Timer: это больше подходит для доступа с mutlithreaded. Экземпляры этого таймера являются потокобезопасными.

  • System.Threading.Timer: экземпляры этого таймера не являются потокобезопасными.

  • System.Windows.Threading.DispatcherTimer → Он отправляет событие в поток Dispatcher (и не является многопоточным). Это полезно, если вам нужно обновить интерфейс.

  • System.Windows.Forms.Timer → Этот таймер вызывает события в потоке пользовательского интерфейса. Это оптимизировано для форм Windows и не должно использоваться в WPF.

Ниже приводится интересное чтение. Сравнение классов таймера в библиотеке классов .NET Framework

Ответ 3

Если вы хотите, чтобы метод выполнялся в другом потоке, чем в пользовательском интерфейсе, используйте System.Threading.Timer. В противном случае (но я не думаю, что это ваш случай), используйте System.Windows.Threading.DispatcherTimer.