11

WPFクライアント アプリケーションを開発しています。このアプリは定期的にデータを に送信しますwebservice。ユーザーがアプリにログインすると、5 mts ごとに特定のメソッドを実行して、.asmxサービスにデータを送信します。

私の質問は、スレッドまたはタイマーを使用する必要があるかどうかです。このメソッドの実行は、ユーザーがアプリケーションと対話しているときに発生するはずです。つまり、このメソッドの実行中に UI をブロックすることなく

検索するリソースはありますか?

4

3 に答える 3

34

newキーワード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 に答える