在我的ViewModel中,我想做几件事,并希望在完成时更新状态。
Kent Boogaart的书建议使用Observable来显示进度。我现在停留在如何做多个工作上,在Task
中说,然后在可观察对象上打勾。我尝试使用Concat
运算符,但所有Task
都立即启动,而不是一个接一个地启动。
public class StartupViewModel : ReactiveObject
{
public string Status { [ObservableAsProperty]get; }
public ReactiveCommand<Unit,string> LoadedCommand { get; set; }
public StartupViewModel()
{
var progress = Observable.Concat(
Task.Run(() =>
{
Thread.Sleep(3000);
return "hello";
}).ToObservable(),
Task.Run(() =>
{
Thread.Sleep(3000);
return "cip";
}).ToObservable(),
Task.Run(() =>
{
Thread.Sleep(3000);
return "2040";
}).ToObservable()
);
LoadedCommand = ReactiveCommand.CreateFromObservable(() => progress);
LoadedCommand
.ToPropertyEx(this, x => x.Status, "Starting up, please be patient");
}
}
答案 0 :(得分:2)
问题是您正在启动Concat
构造内部的所有任务。 Concat
在做正确的事情,并从所有已完成的任务中获取结果。您想要做的是将任务包装在Obserable.Defer
中,这样它们就不会立即全部启动,而只能由Concat
运算符订阅它们:
var progress = Observable.Concat(
Observable.Defer (() => Task.Run(() => { Thread.Sleep(5000); return 1; }).ToObservable()),
Observable.Defer (() => Task.Run(() => { Thread.Sleep(5000); return 2; }).ToObservable())
);
答案 1 :(得分:1)
可能您会喜欢
Content-Disposition: form-data; name="attachment"