5

.Net3.5SP1のRxで遊んでいて、101Rxサンプルを試しています。最初のサンプル([開始]-[コードを非同期で実行])を試していますが、実際には非同期で実行されていないようです。例えば、

        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. 

しかし、おそらく非同期呼び出しが発生している間、メインスレッドはブロックされます。

4

3 に答える 3

1

それは私には合理的に期待されているように見えます。

「Created」と「Starting」の間にThread.Sleep呼び出しを行うと、「Calculating」行が表示され、メインスレッドの実行中に動作していることが示されると思います。それが非同期である方法です。

First()後で参照できる一種の「将来」の値を与えるのではなく、値自体を返すために心配している場合、それは別の問題です-そして私はあなたが読むための2つのブログ投稿を持っています:パート1 ; パート2。私はあなたがその方法を望んでいると思いPruneますが、私は完全にはわかりません。

于 2010-02-19T19:57:31.280 に答える
1

この行// subscribe and wait for completion of background operationは、バックグラウンド操作が完了するのを待つことを示しています。Console.WriteLine("[Started]");したがって、操作が完了するまで、その行()に続くコードが実行されるとは思わないでしょう。

于 2010-02-19T20:12:45.340 に答える
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();
    }
于 2010-03-01T17:04:29.917 に答える