转换IEnumerable"中的同步" foreach项目等效的异步操作

时间:2018-04-10 21:16:24

标签: c# asynchronous system.reactive ienumerable observablecollection

目前我在MVVM项目中有两个类:

  • 具有Presenter的{​​{1}}类以及从ObservableCollection<T>类加载的项目填充它的操作;
  • Loader类本身,其操作Loader反序列化在给定目录中找到的文件。

代码如下。

虽然文件加载是并行进行的,但是我只能在加载所有文件后填充ObservableCollection,这当然是一种糟糕的方法。

我的目标是将GetItems() / Populate转换为在通话结束后立即返回的内容,并且加载的项目会弹出&#34;弹出&#34;在ObservableCollection中加载后立即加载。

我可以想到GetItemsParallel.ForEach s事件的内容,但我不得不承认我已经完全失去了可能的选择。

IObservable

1 个答案:

答案 0 :(得分:2)

这正是Rx(System.Reactive)有用的情况。

试试这个:

class Presenter
{
    public ObservableCollection<TVM> ItemsVM { get; }
        = new ObservableCollection<TVM>();

    public Loader _loader
        = new Loader(some_well_known_directory_path);

    void Populate()
    {
        _loader
            .GetItems()
            .Subscribe(t_item => ItemsVM.Add(new TVM(t_item)));
        }
    }
}

class Loader
{
    readonly string _path;

    public Loader(string path)
    {
        _path = path;
    }

    public IObservable<T> GetItems()
    {
        return
            Observable
                .Defer(() =>
                    Directory
                        .EnumerateFiles(_path)
                        .ToObservable()
                        .SelectMany(fname => Observable.Start(() => T.Load(fname)));
    }
}