RX في .NET 3.5 غير غير متزامن؟
-
21-09-2019 - |
سؤال
ألعب مع 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();
}