質問

私は.NET3.5SP1でRXで遊んでいて、 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