Если вы можете использовать другой пакет, я бы предложил ReactiveUI и его ReactiveCommand, который будет обрабатывать все ваши проблемы из коробки:
var command = ReactiveCommand.CreateFromTask(async () =>
{ // define the work
Console.WriteLine("Executing at " + DateTime.Now);
await Task.Delay(1000);
return "test";
});
command.Subscribe(res => {
// do something with the result: assign to property
});
var d = Observable.Interval(TimeSpan.FromMilliseconds(500), RxApp.TaskpoolScheduler) // you can specify scheduler if you want
.Do(_ => Console.WriteLine("Invoking at " + DateTime.Now))
.Select(x => Unit.Default) // command argument type is Unit
.InvokeCommand(command); // this checks command.CanExecute which is false while it is executing
выходы:
Invoking at 2019-01-22 13:34:04
Executing at 2019-01-22 13:34:04
Invoking at 2019-01-22 13:34:05
Invoking at 2019-01-22 13:34:05
Executing at 2019-01-22 13:34:05
Я знаю, что пакет в основном используется для разработки пользовательского интерфейса, но имеет несколько приятных трюков, таких как ReactiveCommand, который вы можете использовать везде.
Остерегайтесь того, что await command.Execute()
не проверяет по умолчанию возможность выполнения команды.
Я думаю, что это гораздо более читабельно, чем ваше решение.