gpt4 book ai didi

c# - 如何使用 ReactiveUI 在 ViewModel 停用时正确取消任务?

转载 作者:行者123 更新时间:2023-12-03 10:17:16 26 4
gpt4 key购买 nike

在我的 MVVM 应用程序中,当一个 ViewModel 被激活时,一个任务开始建立网络连接,可能需要一些时间才能完成。此任务是可伸缩的:

private async Task ConnectAsync(CancellationToken cancellationToken = default)
{
...
}

我正在使用 IActivatableViewModel 像这样在 ViewModel 激活时启动它:

// Constructor:
public SomeViewModel(...)
{
this.WhenActivated(disposable => {
Observable.StartAsync(ConnectAsync);
});
}

现在,当 ViewModel 在任务完成之前停用时,取消此长时间运行的任务的推荐方法是什么?

我想到了这个:

this.WhenActivated(disposable => {
Observable.StartAsync(ConnectAsync).Subscribe().DisposeWith(disposable);
});

这是正确的解决方案还是有更好的解决方案?

提前致谢!

最佳答案

是的,您在代码片段中显示的代码看起来不错。但是,可能值得移动 ConnectAsync方法调用 ReactiveCommand<TInput, TOutput> (docs)。如果这样做,您将获得订阅 ThrownExceptions 等福利。和 IsExecuting observables,然后显示一些加载指示器或错误消息,让您的用户了解应用程序正在做什么。此外,遵循描述的模式 here , 你可以取消 ReactiveCommand<TInput, TOutput>通过另一个命令或事件。通过事件取消看起来像这样:

// ViewModel.cs
Cancel = ReactiveCommand.Create(() => { });
Connect = ReactiveCommand
.CreateFromObservable(
() => Observable
.StartAsync(ConnectAsync)
.TakeUntil(Cancel));

// View.xaml.cs
this.WhenActivated(disposable => {
this.Events() // Launch the long-running operation
.Loaded
.Select(args => Unit.Default)
.InvokeCommand(ViewModel, x => x.Connect)
.DisposeWith(disposable);
this.Events() // Stop that long-running operation
.Unloaded
.Select(args => Unit.Default)
.InvokeCommand(ViewModel, x => x.Cancel)
.DisposeWith(disposable);
});

在这里,我假设 ConnectAsync是一种接受取消标记并返回 Task 的方法.为了启用 this.Events()魔法,你需要使用 Pharmacist ,或安装 ReactiveUI.Events 之一包。但无论如何,如果您想依赖 WhenActivated,您的选择看起来也不错, 不需要 ThrownExceptions , IsExecuting等。如果您想使用命令并依赖WhenActivated , 然后修改 View.xaml.cs代码:

// View.xaml.cs
this.WhenActivated(disposable => {
Connect.Execute().Subscribe();
Disposable
.Create(() => Cancel.Execute().Subscribe())
.DisposeWith(disposable);
});

我们不会处理 Execute() 返回的订阅因为当命令完成执行时,它们无论如何都会被处理掉。希望这可以帮助! ✨

关于c# - 如何使用 ReactiveUI 在 ViewModel 停用时正确取消任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64124395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com