В настоящее время я пытаюсь обернуть голову вокруг параллелизма с помощью RX .NET и запутать что-то. Я хочу запустить четыре относительно медленных задачи параллельно, поэтому я предположил, что NewThreadScheduler.Default
будет способом, так как он «Представляет объект, который планирует каждую единицу работы в отдельном потоке»..NewThreadScheduler.Default планирует все работать в одном потоке
Вот мой код установки:
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);
}
Я принял «X тему Y» будет выводить другой идентификатор потока каждый раз, однако фактический выход:
Starting. Thread 1
Last line. Thread 1
1 Thread 3
2 Thread 3
3 Thread 3
4 Thread 3
Done. Thread 3
Все работы будучи одним из тех же новых потоков в последовательном порядке, чего я не ожидал.
Я предполагаю, что у меня что-то не хватает, но я не могу понять, что.
Благодарим вас за это. Вы не только разъясняете, что я делаю неправильно, но также думаю, что вы говорите о намерениях Rx, которые имеют большой смысл. –
Вышеприведенный ответ кажется устаревшим, метод Do больше недоступен в Enumerable. – VivekDev
Для того, чтобы метод Do работал, вам необходимо установить пакет System.Interactive nuget – VivekDev