2010-02-19 7 views
5

Я играю с Rx в .Net3.5SP1 и пробовал 101 Rx Samples. Я пытаюсь выполнить первый пример (Start - Run Code Asynchronously), но он, похоже, не работает асинхронно. Например,Rx в .Net 3.5 не асинхронный?

 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] 

Есть ли объяснение этому? Я делаю что-то неправильно? Это ожидаемое поведение?

UPDATE

я бы подумал, что сказал бы

[Creating] 
[Created] 
[Starting] 
Calculating... 
[Started] 
    <...3 Second Wait...> 
Done. 

Но основной поток блокируется, а якобы асинхронная вызов происходит.

ответ

1

Это выглядит разумно ожидаемым для меня.

Если вы положили вызов Thread.Sleep между «Созданным» и «Запуск», я думаю, вы увидите строку «Вычисление», показывающую, что она выполняет работу во время работы основного потока. Именно так он асинхронен.

Если вы обеспокоены тем, что First() возвращает само значение, а не дает своеобразное «будущее» значение, которое вы можете проконсультировать позже, это другое дело - и у меня есть две записи в блоге, которые вы можете прочитать: part 1; part 2. I думаю вы хотите метод Prune, но я не совсем уверен.

+0

Нет, это не проблема ... проблема есть последовательность событий. Я бы подумал, что сказал бы [Создание] [Created] [Начальная] Расчет ... [Started] <... 3 секундной паузой ...> Готово. Но основной поток блокируется, пока происходит якобы вызов Asynch ... –

+0

@kouPhax: Метод First() должен * возвращать * значение, хотя, не так ли? (По общему признанию, значение в этом случае просто «Unit», но все же ...) Это означает, что он не может завершить до * после завершения вычисления. В принципе, вычисление * * происходит асинхронно, но вызов First() ждет его завершения. В комментарии явно говорится, что: // подписка и ожидание завершения фоновой операции –

+0

Ha! Предположим, я должен научиться читать! благодаря –

1

В строке // subscribe and wait for completion of background operation указано, что она ждет завершения операции фона. Таким образом, вы не ожидаете, что код, следующий за этой строкой (Console.WriteLine("[Started]");), будет выполняться до завершения операции, не так ли?

1

Первый блокирует ... Подписаться что вы хотите:

 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(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^