سؤال

هل من الممكن إرسال المدخلات إلى محلل FParsec في أجزاء، اعتبارًا من المقبس؟إذا لم يكن الأمر كذلك، فهل من الممكن استرداد النتيجة الحالية والجزء غير المحلل من دفق الإدخال حتى أتمكن من إنجاز ذلك؟أحاول تشغيل أجزاء المدخلات القادمة من SocketAsyncEventArgs دون التخزين المؤقت للرسائل بأكملها.

تحديث

سبب ملاحظة الاستخدام SocketAsyncEventArgs كان للدلالة على أن إرسال البيانات إلى CharStream قد يؤدي إلى الوصول غير المتزامن إلى الأساسي Stream.على وجه التحديد، أنا أتطلع إلى استخدام مخزن مؤقت دائري لدفع البيانات الواردة من المقبس.أتذكر وثائق FParsec التي تشير إلى أن الملف الأساسي Stream لا ينبغي الوصول إليه بشكل غير متزامن، لذلك خططت للتحكم يدويًا في التحليل المقسم.

الأسئلة النهائية:

  1. هل يمكنني استخدام مخزن مؤقت دائري أسفل ملفي Stream مرت إلى CharStream?
  2. ألا أحتاج إلى القلق بشأن التحكم اليدوي في عملية التقطيع في هذا السيناريو؟
هل كانت مفيدة؟

المحلول

الإصدار العادي من FParsec (وإن لم يكن نسخة منخفضة الثقة) يقرأ الإدخال بطريقة القطعة، أو "بطريقة الكتلة"، كما أسميه في ملف CharStream توثيق.وبالتالي، إذا قمت ببناء CharStream من System.IO.Stream والمحتوى كبير بما يكفي ليشمل عدة CharStream الكتل، يمكنك البدء في التحليل قبل استرداد الإدخال بالكامل.

لاحظ مع ذلك، أن CharStream سوف يستهلك تدفق الإدخال في أجزاء ذات حجم ثابت (ولكن قابل للتكوين)، أي.سوف يطلق على Read طريقة System.IO.Stream كلما كان ذلك ضروريًا لملء كتلة كاملة.ومن ثم، إذا قمت بتحليل المدخلات بشكل أسرع مما يمكنك من استرداد المدخلات الجديدة، فإن CharStream قد يتم حظره على الرغم من وجود بعض المدخلات التي لم يتم تحليلها بالفعل، لأنه لا يوجد حتى الآن ما يكفي من المدخلات لملء كتلة كاملة.

تحديث

الإجابة (الإجابات) على أسئلتك النهائية: 42.

  • كيف تقوم بتنفيذ Stream الذي تقوم ببناء CharStream الأمر متروك لك تمامًا.القيد الذي تتذكره والذي يستثني الوصول الموازي ينطبق فقط على CharStream فئة، وهي ليست سلسلة آمنة.

  • تنفيذ Stream كما من المرجح أن يكون هناك مخزن مؤقت دائري تقييد الحد الأقصى للمسافة التي يمكنك التراجع من خلالها.

  • حجم الكتلة من CharStream يؤثر على المدى الذي يمكنك التراجع فيه عندما Stream لا يدعم السعي.

  • إن أبسط طريقة لتحليل الإدخال بشكل غير متزامن هي إجراء التحليل في مهمة غير متزامنة (على سبيل المثال.على موضوع الخلفية).في المهمة، يمكنك ببساطة قراءة المقبس بشكل متزامن، أو إذا كنت لا تثق في التخزين المؤقت بواسطة نظام التشغيل، فيمكنك استخدام فئة دفق مثل BlockingStream الموصوفة في المقالة التي قمت بربطها في التعليق الثاني أدناه.

  • إذا كان من الممكن فصل المدخلات بسهولة إلى أجزاء مستقلة (على سبيل المثال.سطورًا لتنسيق نص يستند إلى سطر)، قد يكون من الأفضل تقسيمها بنفسك ثم تحليل قطعة الإدخال قطعة تلو الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top