2013-01-12 8 views
10

WPFクライアントアプリケーションを開発中です。このアプリケーションは定期的にwebserviceにデータを送信します。ユーザーがアプリケーションにログインしたとき、私は毎回5 mtsの特定のメソッドを実行して、.asmxサービスにデータを送信します。スレッドやタイマーを使用してWPFクライアントアプリケーションからメソッドを定期的に実行する方法

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

検索に必要な資料はありますか?

答えて

2

メソッドをUIと異なるスレッドで実行する場合は、System.Threading.Timerを使用します。それ以外の場合(私はあなたのケースだとは思わない)、System.Windows.Threading.DispatcherTimerを使用してください。

+0

OK私はMainwindow.xaml.cs mainメソッドでこれを書き込みます。子ウィンドウを開いてもこのタイマーがチェックされますか?または、アプリケーションのメインウィンドウや子ウィンドウのどこにいても、このコードを置くのに最適な場所は何ですか? –

+0

@sateeshmunagalaタイマーを使用している間にコンテナクラスが破棄されていないかぎり、それを配置するコンテキストは関係ありません。 – Mir

8

Timerクラスを使用する必要があります。複数のビルトインタイマーがあり、使用するタイマーの要件に依存します。

  1. System.Timers.Timer:これはmutlithreadedアクセスに適しています。このタイマーのインスタンスはスレッドセーフです。

  2. System.Threading.Timer:このタイマーのインスタンスはスレッドセーフではありません。

  3. System.Windows.Threading.DispatcherTimer - >スレッドをDispatcherスレッドに送信します(マルチスレッドではありません)。これは、UIを更新する必要がある場合に便利です。

  4. System.Windows.Forms.Timer - >このタイマーは、UIスレッドでイベントを発生させます。これは、Windowsフォームに最適化され、WPFでは使用されません。

以下は興味深い読みです。
Comparing the Timer Classes in the .NET Framework Class Library

+0

あなたのリンクをありがとうが、私はいくつかの難しさを理解している要件:クライアントはWPFアプリケーションとスムーズに対話し、同時にデータをサービスに送信することができます。 これは私が使用する必要があるタイマーを内蔵している私のreqです? –

+0

それらは別々のもの(クライアントとのやりとり、データの送信)であるか、従属部分として結ばれていますか? – Tilak

+0

はい、それらは独立です。ユーザーはデータを挿入、更新、削除できますが、データベースからサービスにデータを送信します。 –

27

私は新しい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 
} 
+1

ありがとう!私はあなたのアプローチが本当に好きです! – lightxx

+0

私はアプローチが好きですが、while {}およびWritePixelsの前にWriteableBitmapを作成してThreading.Dispatcher.VerifyAccess()を受け取ると、Method/Taskは1つのスレッドにあると思っていましたか? –

+0

このアプローチはParallelですか? –

関連する問題