2016-08-29 5 views
0

誰かがこの動作を説明できるかどうかを見てみましょう。どうすればこの問題を解決できますか?私はWPFアプリを持っていて、私のViewModelにはDispatcherTimerがあります。私は、モーダルウィンドウを表示するコマンドを持っているViewModelにでは、このような何か:私はボタンからこのコマンドを呼び出すとDispatcherTimerとShow Modal Window

private void ShowWindowCommandExecuted() 
{ 
    wnNewWindow window = new wnNewWindow(); 
    window.ShowDialog(); 
} 

、新しいウィンドウが示されており、DispatcherTimerはバックグラウンドで動作を続けています。ここまでは順調ですね。私はこのようなDispatcherTimerからウィンドウ表示するようにしようとすると、問題がされています。この場合、

DispatcherTimer timerInstrucciones; 
timerInstrucciones = new DispatcherTimer(); 
timerInstrucciones.Interval = TimeSpan.FromMilliseconds(1000); 
timerInstrucciones.Tick += (s, e) => 
{ 
    wnNewWindow window = new wnNewWindow(); 
    window.ShowDialog();  
}; 
timerInstrucciones.Start(); 

を、新しいウィンドウも表示されますが、限り、それが表示されている、DispatcherTimerは「カチカチ」を停止します。私はDispatcherTimerがUIスレッドで実行されていることを理解していますが、なぜこの場合は別の方法で動作しますか?

+1

後者の場合、Tickイベントハンドラをブロックしている点が異なります。 DispatcherTimerは、前のTickハンドラが実行を完了していない限り、別のTickイベントを続行して起動しません。 – Clemens

+0

Ok @クレメンス、今私はそれを理解する!それは私には明らかだったはずです。それを解決する方法はありますか? – Pikoh

+0

答えに示唆されているBeginInvokeソリューションを試しましたか? – Clemens

答えて

2

通常、ShowDialogはモーダルダイアログで、呼び出しスレッドをブロックしてダイアログを表示します。また、親/所有ウィンドウとのやりとりもブロックします。

モーダルダイアログを閉じると、UIスレッドはブロックされます。そのDispatcherTimerのため、ウィンドウのディスパッチャに属し、同じスレッドで実行されます。したがって、このスレッドがブロックされている場合は、DispatcherTimerの実行が停止します。あなたのコメントに基づいて

UPDATE:

私はこの上の任意のドキュメントを経ていないが、基本的な違いはDispatcherTimerAsynchronous方法でSynchronouslyを実行しませんでしょう。

は、ディスパッチャをブロックしません:

timerInstrucciones.Tick += (s, e) => 
     { 
      this.Dispatcher.BeginInvoke(new Action(() => 
      { 
       wnNewWindow mn = new wnNewWindow(); 
       mn.ShowDialog(); 
      })); 
     }; 

は、ディスパッチャブロックされます:Dispatcherは、n秒ごとにEventInvokeなり、以来

timerInstrucciones.Tick += (s, e) => 
     { 
      this.Dispatcher.Invoke(new Action(() => 
      { 
       wnNewWindow mn = new wnNewWindow(); 
       mn.ShowDialog(); 
      })); 
     }; 

を、Eventを呼び出すことはできませんスレッド内で操作がブロックされた場合は、呼び出し中のEvent

+0

私は、モーダルウィンドウを表示すると、呼び出し元のコードで実行が停止することがわかります(これはモーダルなのです)。しかし、私の例では、ウィンドウは 'DispatcherTimer'を停止しません。 'DispatcherTimer'コードの中からモーダルウィンドウを表示すると、それは停止します。それは私が理解できないものです。 – Pikoh

+0

@Pikoh私の答えを更新しました。希望が役立ちます。 – Gopichandar

+0

あなたの 'BeginInvoke'コードを試していますが、アクションを起動しません。 – Pikoh

関連する問題