【问题标题】:PRISM (ViewModel): Ensure a command does not get executed multiple times simultaneouslyPRISM (ViewModel):确保一个命令不会同时执行多次
【发布时间】:2016-08-20 03:32:48
【问题描述】:

我正在尝试禁用频繁的用户手势,以便同一命令不会同时执行多次。

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

【问题讨论】:

    标签: c# wpf mvvm prism delegatecommand


    【解决方案1】:
    • ObservesCanExecute 与触发 PropertyChanged 的属性一起使用(它不会轮询常规属性以进行更改)

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

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

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

    【讨论】:

    • 只是好奇:是否有人对此问题有某种“最佳实践”实施?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2021-02-28
    • 2012-08-31
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多