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无论线程正在执行什么命令,你都让一个线程通过。所以,如果你想CommandACommandB并行执行,但一次只执行一个,你需要_semaphoreSlimA_semaphoreSlimB

  • 至于SemaphoreSlim- 如果你只希望一个线程通过,aAsyncAutoResetEvent会做同样的事情但更容易理解。

  • 如果您不希望某种类型的命令排队,请使用AutoResetEvent并尝试WaitOne(0),如果您不获取锁,则中止命令。

于 2016-08-20T09:31:30.177 回答