我试图禁用频繁的用户手势,因此同一命令不会同时执行多次。
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()
,因为我手动打开和关闭标志?_semaphoreSlim
在一个命令正在进行时是否会阻止所有命令,还是阻止对同一命令进行多次调用?答案 0 :(得分:2)
ObservesCanExecute
适用于触发PropertyChanged
的属性(它不会轮询常规属性进行更改)
无论线程执行什么命令,您的_semaphoreSlim
让一个线程通过。因此,如果您希望CommandA
和CommandB
并行执行,但每次只需执行其中一项,则需要_semaphoreSlimA
和_semaphoreSlimB
至于SemaphoreSlim
- 如果你只想传递一个线程,AsyncAutoResetEvent
会做同样的事情,但更容易理解。
如果您不希望类型的命令排队,请使用AutoResetEvent
并尝试WaitOne(0)
,如果您不获取锁定,则中止命令。