如何顺序运行Tasks并将结果放入IObservable

时间:2019-05-22 02:08:37

标签: system.reactive reactiveui

在我的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");
    }
}

2 个答案:

答案 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"