WPF
クライアント アプリケーションを開発しています。このアプリは定期的にデータを に送信しますwebservice
。ユーザーがアプリにログインすると、5 mts ごとに特定のメソッドを実行して、.asmx
サービスにデータを送信します。
私の質問は、スレッドまたはタイマーを使用する必要があるかどうかです。このメソッドの実行は、ユーザーがアプリケーションと対話しているときに発生するはずです。つまり、このメソッドの実行中に UI をブロックすることなく
検索するリソースはありますか?
WPF
クライアント アプリケーションを開発しています。このアプリは定期的にデータを に送信しますwebservice
。ユーザーがアプリにログインすると、5 mts ごとに特定のメソッドを実行して、.asmx
サービスにデータを送信します。
私の質問は、スレッドまたはタイマーを使用する必要があるかどうかです。このメソッドの実行は、ユーザーがアプリケーションと対話しているときに発生するはずです。つまり、このメソッドの実行中に UI をブロックすることなく
検索するリソースはありますか?
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
}
Timer
クラスを使用する必要があります。複数の組み込みタイマーがあり、どのタイマーを使用するかは要件によって異なります。
System.Timers.Timer : これは、マルチスレッド アクセスにより適しています。このタイマーのインスタンスはスレッドセーフです。
System.Threading.Timer : このタイマーのインスタンスはスレッド セーフではありません。
System.Windows.Threading.DispatcherTimer -> イベントをDispatcher
スレッドに送信します (マルチスレッドではありません)。これは、UI を更新する必要がある場合に便利です。
System.Windows.Forms.Timer -> このタイマーは、UI スレッドでイベントを発生させます。これは Windows フォーム用に最適化されており、WPF では使用されません。
以下は興味深い読み物です。
.NET Framework クラス ライブラリのタイマー クラスの比較
メソッドを UI スレッドとは別のスレッドで実行する場合は、 を使用しますSystem.Threading.Timer
。それ以外の場合 (ただし、あなたの場合ではないと思います)、使用しますSystem.Windows.Threading.DispatcherTimer
。