2

同じコマンドが同時に複数回実行されないように、頻繁なユーザー ジェスチャを無効にしようとしています。

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進行中のすべてのコマンドを保留しますか、それとも同じコマンドの複数の呼び出しを保留しますか?
4

1 に答える 1

1
  • ObservesCanExecuteトリガーするプロパティで動作しますPropertyChanged(変更のために通常のプロパティをポーリングしません)

  • _semaphoreSlimスレッドが実行しているコマンドに関係なく、スレッドを 1 つ渡しましょう。したがって、並列に実行したいが、一度に 1 つずつしか実行したくない場合は、and が必要CommandAになります。CommandB_semaphoreSlimA_semaphoreSlimB

  • -についてSemaphoreSlimは、スレッドを 1 つだけ通過させたい場合は、a のAsyncAutoResetEvent方が同じことを実行できますが、より理解しやすくなります。

  • あるタイプのコマンドをキューに入れたくない場合は、 を使用AutoResetEventして試してみてくださいWaitOne(0)。ロックを取得しない場合は、コマンドを中止してください。

于 2016-08-20T09:31:30.177 に答える