Вопрос

Я играю с 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();
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top