Rx в .net 3.5 не асинхронно?
-
21-09-2019 - |
Вопрос
Я играю с RX в .net3.5sp1 и пробую 101 RX образцы. Анкет Я пробую первый образец (запустить - запустить код асинхронно), но, похоже, он не работает асинхронно. Например,
Console.WriteLine("[Creating]");
var o = Observable.Start(() =>
{
Console.WriteLine("Calculating...");
Thread.Sleep(3000);
Console.WriteLine("Done.");
});
Console.WriteLine("[Created]");
Console.WriteLine("[Starting]");
o.First(); // subscribe and wait for completion of background operation
Console.WriteLine("[Started]");
Выходы
[Creating]
[Created]
[Starting]
Calculating...
<...3 Second Wait...>
Done.
[Started]
Есть ли объяснение для этого? Я делаю что-то неправильно? Это ожидаемое поведение?
ОБНОВИТЬ
Я бы подумал, что это сказал бы
[Creating]
[Created]
[Starting]
Calculating...
[Started]
<...3 Second Wait...>
Done.
Но главный поток заблокирован, в то время как предположительно асинхронное вызов происходит.
Решение
Это выглядит разумно ожидаемым мне.
Если вы положите Thread.Sleep
Позвоните между «созданным» и «запуском», я думаю, вы увидите, как появится линия «расчеты», показывая, что она выполняет работу, пока основной поток работает. Это способ, которым это асинхронно.
Если вы обеспокоены, потому что First()
Возвращает саму ценность, вместо того, чтобы придавать какую -то «будущую» ценность, с которой вы можете проконсультироваться позже, это другой вопрос - и у меня есть два сообщения в блоге для прочтения: Часть 1; часть 2. Анкет я считать Вы хотите Prune
Метод, но я не совсем уверен.
Другие советы
Линия // subscribe and wait for completion of background operation
Говорит, что он ожидает завершения фоновой операции. Так что вы не ожидаете, что код следит за этой строкой (Console.WriteLine("[Started]");
) работать до тех пор, пока операция не будет завершена, верно?
Сначала блокируется ... подписаться - это то, что вы хотите:
public static void Main(string[] args) {
Console.WriteLine("[Creating]");
var o = Observable.Start(() =>
{
Console.WriteLine("Calculating...");
Thread.Sleep(3000);
});
Console.WriteLine("[Created]");
Console.WriteLine("[Starting]");
o.Subscribe(_ => Console.WriteLine("Done.")); // subscribe and wait for completion of background operation
Console.WriteLine("[Started]");
Console.ReadKey();
}