سؤال

ألعب مع 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