NewThreadScheduler.Default plant alle Arbeiten am selben Thread

Ich versuche gerade, mich mit der Parallelität von RX .NET zu beschäftigen und durch etwas verwirrt zu werden. Ich möchte vier relativ langsame Tasks gleichzeitig ausführen, also bin ich davon ausgegangenNewThreadScheduler.Default wäre der Weg zu gehen, wie es ist"Stellt ein Objekt dar, das jede Arbeitseinheit in einem separaten Thread plant.".

Hier ist mein Setup-Code:

    static void Test()
    {
        Console.WriteLine("Starting. Thread {0}", Thread.CurrentThread.ManagedThreadId);

        var query = Enumerable.Range(1, 4);
        var obsQuery = query.ToObservable(NewThreadScheduler.Default);
        obsQuery.Subscribe(DoWork, Done);

        Console.WriteLine("Last line. Thread {0}", Thread.CurrentThread.ManagedThreadId);
    }

    static void DoWork(int i)
    {
        Thread.Sleep(500);
        Console.WriteLine("{0} Thread {1}", i, Thread.CurrentThread.ManagedThreadId);
    }

    static void Done()
    {
        Console.WriteLine("Done. Thread {0}", Thread.CurrentThread.ManagedThreadId);
    }

Ich nahm an, dass der "X Thread Y" jedes Mal eine andere Thread-ID ausgibt, die tatsächliche Ausgabe ist jedoch:

Starting. Thread 1
Last line. Thread 1
1 Thread 3
2 Thread 3
3 Thread 3
4 Thread 3
Done. Thread 3

Die ganze Arbeit besteht darin, nacheinander auf demselben neuen Thread zu arbeiten, was ich nicht erwartet hatte.

Ich nehme an, ich vermisse etwas, aber ich kann nicht herausfinden, was.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage