Xamarin.Formsでボタンの2重/同時押し抑止
2019年11月16日
ReactiveCommand使ってるんだけど。
2重押し、同時押しできちゃう。
最初、SemaphoreSlimをVMから見れるServiceに置いて、各CommandのSubscribeの中に書いてたけど。
1 2 3 4 5 6 7 8 9 10 11 |
if (await statusService.SemaphoreButtonLock.WaitAsync(10)) { try { } finally { statusService.SemaphoreButtonLock.Release(); } } |
これだとすべての処理に入れなきゃならないので大変。
上記をラップしてメソッド化したが排他効かない。というか順に呼ばれちゃう。。。(´・ω・`)
AsyncReactiveCommandを使って2重押しは抑止できたが他のボタンとの同時押しができちゃう。。。(´・ω・`)
ググること数日、AsyncReactiveCommandにsharedCanExecuteを指定するとできることが判明。!∑(゜∀゜)
1 2 3 4 5 |
public ReactiveProperty<bool> ButtonState { get; } = new ReactiveProperty<bool>(true); EditCommand = IsBusy.CombineLatest(SelectedItem, (busy, select) => !busy && select != null).ToAsyncReactiveCommand(statusService.ButtonState); ClearCommand = new AsyncReactiveCommand(statusService.SharedGate); |
みたいな感じで。
Rxすげー。
—
(参考サイト)
https://qiita.com/toRisouP/items/c6fba9f01e6d15dabd79