Size: a a a

2020 October 11

λР

λетучая Рыба... in .NET Talks
в которую можно запихать таску
источник

λР

λетучая Рыба... in .NET Talks
и у которой можно подписаться на .ThrownExceptions, .IsExecuting и RxApp.DefaultExceptionHandler
источник

RS

Rustam Sayfutdinov in .NET Talks
То есть все же надо понять команду😒
источник

λР

λетучая Рыба... in .NET Talks
чтобы try catch не писать
источник

RS

Rustam Sayfutdinov in .NET Talks
И каким боком тут linq
источник

λР

λетучая Рыба... in .NET Talks
Rustam Sayfutdinov
И каким боком тут linq
тут — никаким
источник

λР

λетучая Рыба... in .NET Talks
а вот если начинаешь сложные индикаторы формировать
источник

λР

λетучая Рыба... in .NET Talks
например, "хочу, чтобы кнопка была выключена, пока команда или выполняется, или юзер ввёл ересь, или пока выполняется иная фоновая операция"
источник

λР

λетучая Рыба... in .NET Talks
тогда пишется на реактивках что-то наподобие
источник

λР

λетучая Рыба... in .NET Talks
// IObservable<bool>
var canExecute =
 this.WhenAnyValue(x => x.UserName)
     .Select(name => !string.IsNullOrWhiteSpace(name))
     .CombineLatest(background.IsExecuting,
       (valid, executing) => valid && executing);

// ICommand
var command = ReactiveCommand.CreateFromTask(
 DoStuffAsync,
 canExecute)
источник

λР

λетучая Рыба... in .NET Talks
ну то есть WhenAnyValue(x => x.UserName) слушает изменения св-ва UserName (превращает string в IObservable<string>), background.IsExecuting возвращает IObservable<bool>, который эмитит true если фоновая операция выполняется и false если не, и вдобавок ReactiveCommand выключит кнопку, пока выполняется DoStuffAsync
источник

λР

λетучая Рыба... in .NET Talks
если делать не на реактивках, надо заводить event, метод-обработчик, штучки 3 флага-индикатора (один обновляется из метода-обработчика, другой обновляется из сеттера UserName, третий обновляется когда запускается или останавливается таска из DoStuffAsync) и делать Dispatcher.Invoke в некоторых местах
источник

λР

λетучая Рыба... in .NET Talks
и внутри этого DoStuffAsync держать try {} catch {}
источник

λР

λетучая Рыба... in .NET Talks
λетучая Рыба
// IObservable<bool>
var canExecute =
 this.WhenAnyValue(x => x.UserName)
     .Select(name => !string.IsNullOrWhiteSpace(name))
     .CombineLatest(background.IsExecuting,
       (valid, executing) => valid && executing);

// ICommand
var command = ReactiveCommand.CreateFromTask(
 DoStuffAsync,
 canExecute)
в случае ReactiveUI достаточно подписаться на command.ThrownExceptions или RxApp.DefaultExceptionHandler (это похоже на миддлвару в контексте ASP .NET Core, в которую валятся все ошибки, и которые можно обработать или залогировать, чтобы не развалиться)
источник

λР

λетучая Рыба... in .NET Talks
в общем минутка рекламы, да
источник

λР

λетучая Рыба... in .NET Talks
λетучая Рыба
// IObservable<bool>
var canExecute =
 this.WhenAnyValue(x => x.UserName)
     .Select(name => !string.IsNullOrWhiteSpace(name))
     .CombineLatest(background.IsExecuting,
       (valid, executing) => valid && executing);

// ICommand
var command = ReactiveCommand.CreateFromTask(
 DoStuffAsync,
 canExecute)
вот чтобы Select и CombineLatest стали привычными, надо осилить LINQ (CombineLatest ~ Zip но, так сказать, с более частыми уведомлениями)
источник

λР

λетучая Рыба... in .NET Talks
эт уже посидеть поиграться надо
источник

RS

Rustam Sayfutdinov in .NET Talks
Ну хз, не кажется что именно линк, просто линк часто используется в дотнете, чем что либо еще в таком же виде
источник

λР

λетучая Рыба... in .NET Talks
Rustam Sayfutdinov
Ну хз, не кажется что именно линк, просто линк часто используется в дотнете, чем что либо еще в таком же виде
эт вообще называют LINQ over Observable
источник

RS

Rustam Sayfutdinov in .NET Talks
🤷‍♂️
источник