Подпишитесь на несколько Observables и получайте уведомления в одной теме - PullRequest
1 голос
/ 07 февраля 2020
foreach (...) {
    Observable.FromAsync(GetData()/* an async function() */)
        .DoWhile(() => true)
        .Subscribe(data => {
            DoSomething(); // I want all of my Subscribe() to call this on the same thread
        });
}

GetData() возвращает данные асинхронно. Я создал несколько Observable s, подписался на них и хочу получать уведомления (вызов DoSomething()) в одном и том же потоке всякий раз, когда возвращаются данные. Я пробовал BlockingCollection<>, но напрасно ...: (

Кто-нибудь знает, как это сделать?

PS: я не хочу использовать очередь сообщений (например, Redis pub / sub) для достижения этого.

1 Ответ

2 голосов
/ 08 февраля 2020

Вы хотите обрабатывать каждое сообщение в одной и той же цепочке и блокировать цепочку до тех пор, пока не прибудет следующее сообщение - это очень распространенная парадигма, называемая Событие L oop.

И, как выясняется, вы можете запускать вещи в событии l oop в Rx с соответствующим именем EventLoopScheduler.

    var values = Observable.Interval(TimeSpan.FromSeconds(0.1));

    void DoSomething(long value) => Console.WriteLine($"Value: {value}, Thread: {Thread.CurrentThread.Name}");

    var eventloop = new EventLoopScheduler();

    values.ObserveOn(eventloop).Subscribe(DoSomething);

Выход:

Value: 0, Thread: Event Loop 1
Value: 1, Thread: Event Loop 1
Value: 2, Thread: Event Loop 1
Value: 3, Thread: Event Loop 1
Value: 4, Thread: Event Loop 1
Value: 5, Thread: Event Loop 1
Value: 6, Thread: Event Loop 1
Value: 7, Thread: Event Loop 1
...