PRISM(ViewModel):确保命令不会同时多次执行

时间:2016-08-20 03:32:48

标签: c# wpf mvvm prism delegatecommand

我试图禁用频繁的用户手势,因此同一命令不会同时执行多次。

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在一个命令正在进行时是否会阻止所有命令,还是阻止对同一命令进行多次调用?

1 个答案:

答案 0 :(得分:2)

  • ObservesCanExecute适用于触发PropertyChanged的属性(它不会轮询常规属性进行更改)

  • 无论线程执行什么命令,您的_semaphoreSlim让一个线程通过。因此,如果您希望CommandACommandB并行执行,但每次只需执行其中一项,则需要_semaphoreSlimA_semaphoreSlimB

  • 至于SemaphoreSlim - 如果你只想传递一个线程,AsyncAutoResetEvent会做同样的事情,但更容易理解。

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