你好」我已經試過了的101個的Rx例子之一:爲什麼Rx Observable.Subscribe會阻止我的線程?
static IEnumerable<int> GenerateAlternatingFastAndSlowEvents()
{
int i = 0;
while (true)
{
if (i > 1000)
{
yield break;
}
yield return i;
Thread.Sleep(i++ % 10 < 5 ? 500 : 1000);
}
}
private static void Main()
{
var observable = GenerateAlternatingFastAndSlowEvents().ToObservable().Timestamp();
var throttled = observable.Throttle(TimeSpan.FromMilliseconds(750));
using (throttled.Subscribe(x => Console.WriteLine("{0}: {1}", x.Value, x.Timestamp)))
{
Console.WriteLine("Press any key to unsubscribe");
Console.ReadKey();
}
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
我不明白爲什麼行‘按任意鍵退訂’從來沒有顯示。我的理解是訂閱是異步的,你訂閱並立即返回。我錯過了什麼導致我的主線程阻塞?
因此使用.ToObservable創建一個在當前線程上運行的Observable,因此它運行Generate ..方法的主線程。所以訂閱不會阻塞線程,因爲它忙於執行observable。那麼,如果我使用SubscribeOn並傳遞ThreadPoolScheduler,那麼我看到消息「按任意鍵取消訂閱」是怎麼回事?如果我的線程忙於執行observable,那麼應該不會影響我訂閱的位置。 – Eldar 2011-02-26 10:05:26
@Eldar - 只要您使用'SubscribeOn(Scheduler.ThreadPool)',那麼訂閱和觀察者就會在新線程上運行,這樣'Subscribe'方法會立即返回,您將看到您的消息。只有當您的可觀察計劃使用'CurrentThread'調度程序時,您的'Subscribe'方法和觀察者才能在當前線程上運行。 – Enigmativity 2011-02-28 00:31:28