Obecnie próbuję otoczyć moją głowę wokół współbieżności z RX .NET i wprowadzając w błąd przez coś. Chcę równolegle uruchomić cztery stosunkowo powolne zadania, więc założyłem, że NewThreadScheduler.Default
może być drogą do wykonania, ponieważ jest to "Reprezentuje obiekt, który planuje każdą jednostkę pracy w osobnym wątku.".NewThreadScheduler.Default harmonogramuje wszystkie prace na tym samym wątku
Oto mój kod instalacyjny:
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);
}
Przypuszczałem „X wątek Y” będzie wyjście inny identyfikator wątku za każdym razem, jednak rzeczywista moc jest:
Starting. Thread 1
Last line. Thread 1
1 Thread 3
2 Thread 3
3 Thread 3
4 Thread 3
Done. Thread 3
Cała praca jest bycie jednym z tego samego nowego wątku w porządku sekwencyjnym, czego nie oczekiwałem.
Zakładam, że czegoś brakuje, ale nie wiem, co.
Dziękuję za to. Nie tylko wyjaśnisz, co robię źle, ale myślę też, że to, co mówisz odnośnie intencji Rx, ma wiele sensu. –
Powyższa odpowiedź wydaje się być nieaktualna, metoda Do nie jest już dostępna w Enumerable. – VivekDev
Aby metoda Do mogła działać, należy zainstalować pakiet System.Interactive nuget – VivekDev