2016-08-20 1 views
1

同時に複数回実行されません。私は、同じコマンドを同時に複数回実行されませんので、頻繁にユーザーのジェスチャーを無効にしようとしています。PRISM(ViewModelに):コマンドを確認し

private readonly SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(1);    
public bool MyCommandCanExecute { get; set; } = true; 
public DelegateCommand MyCommand { get; set; } 

MyCommand = new DelegateCommand(async() => 
{ 
    await _semaphoreSlim.WaitAsync(); 

    try 
    { 
     MyCommandCanExecute = false; 
     // run code 
    } 
    finally 
    { 
     MyCommandCanExecute = true; 
     _semaphoreSlim.Release(); 
    } 
}).ObservesCanExecute(p => MyCommandCanExecute); 

私はこの権利を守っているのか分かりません。

  • SemaphoreSlimは残念ですか、安全のためにそこに放置する必要がありますか?
  • 私は手動でフラグをオンまたはオフにしているので、ObservesCanExecute()が必要ですか?
  • 同じビューモデルに複数のコマンドがあり、それぞれに別々のCanExecuteフラグがあります。私はすぐに別のコマンドが実行されている間にあるコマンドを有効にする必要がある場合に実行すると思っています。 _semaphoreSlimは、進行中のすべてのコマンドを保留しているか、同じコマンドの複数の呼び出しを保持していますか?どんなにスレッドが実行されたコマンド何PropertyChangedを誘発する性質を持つ

答えて

2
  • ObservesCanExecute作品(それは変更のための定期的なプロパティをポーリングしません)

  • あなた_semaphoreSlimみましょう1つのスレッドパス、。一度にCommandACommandB並列に実行するために、それらのそれぞれの一つだけをしたいのであれば、あなたはSemaphoreSlimについては_semaphoreSlimA_semaphoreSlimB

  • をする必要があります - あなたは合格するだけで、1つのスレッドAをしたい場合​​は同じことをしますが、より理解できます。

  • タイプのコマンドをキューに入れたくない場合は、AutoResetEventを使用してWaitOne(0)を試し、ロックを取得しない場合はコマンドを打ち切ります。

関連する問題