所有订阅结束时获取

时间:2017-02-02 16:04:08

标签: c# system.reactive

我正在创建多个订阅。

我需要检测他们(所有)何时完成才能执行某项操作。

private IList<IDisposable> subscriptions = new List<IDisposable>();

private void CreateSubscriptions(IEnumerable<int> integers)
{
    if (this.subscriptions.Any())
        foreach (IDisposable subscription in this.subscriptions)
            subscription.Dispose();

    this.subscriptions.Clear();

    for (int i = 0; i < 50; i++)
    {    
        this.subscriptions.Add(
            Observable.Create<int>(
                observer =>
                {
                    foreach (int i in integers)
                        observer.OnNext(i);

                    observer.Completed();

                    return System.Reactive.Disposables.Disposable.Empty;
                }
            )
            .SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler.Default)
            .ObserveOn(this.fuasTileControl)
            .Subscribe(
                // action
            );
    }
}

正如您所看到的,我创建了50个可观察的信息,告知IEnumerable<int>的下一个值。这是一个示例代码。

我需要在所有订阅结束(已完成)后才能执行操作。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

可能有更好的选择,但我知道的是使用Merge运算符。请参阅http://reactivex.io/documentation/operators/merge.html

然后您可以订阅此可观察对象。如果您需要阻止解决方案,则可以使用Wait()代替。

我也对其他解决方案感兴趣。

void Main()
{
    var sequence = CreateSubscriptions( new[] {1,5,6});

    sequence.Subscribe((i) => {}, () => { Console.WriteLine("all ready"); });

    //sequence.Wait();
    //Console.WriteLine("all ready");
}

private IList<IDisposable> subscriptions = new List<IDisposable>();

private IObservable<int> CreateSubscriptions(IEnumerable<int> integers)
{
    if (this.subscriptions.Any())
        foreach (IDisposable subscription in this.subscriptions)
            subscription.Dispose();

    this.subscriptions.Clear();
    var sequences = new List<IObservable<int>>();

    for (int ix = 0; ix < 5; ix++)
    {    
        var sequence = Observable.Create<int>(
                observer =>
                {
                    foreach (int i in integers)
                        observer.OnNext(i);

                    observer.OnCompleted();

                    return System.Reactive.Disposables.Disposable.Empty;
                }
            );
        sequences.Add(sequence);    
        this.subscriptions.Add(sequence.Subscribe(nr => 
        {  
            Console.WriteLine(nr); 
        }));
    }

    return Observable.Merge(sequences);
}

我也进行了一些小修改以使其编译。

答案 1 :(得分:1)

稍微迂腐但正确的答案是这是不可能的:订阅由IDisposable表示,它没有提供外部方法来检测它何时终止(除了彻底导致终止)。更准确地说,鉴于您在上面说明的函数来填充IList<IDisposable> subscriptions,在处理所有这些订阅时,没有机制可以执行/订阅。

然而,有一种方法可以对一组可观察对象进行操作(由IObservable表示),以及何时完成。

鉴于IEnumerable<IObservable> observablesIObservable<IObservable> observables,以下内容将起作用:

observables
    .Merge()
    .Subscribe(
        item => { /*onNext handler*/ }, 
        e =>    { /*onError handler*/ }, 
        () =>   { /* onCompleted handler */});

您可能希望将您想要的任何操作作为onCompleted处理程序。