سؤال

أنا أحاول فقط جعل بعض البرمجة المقبس، باستخدام مآخذ غير حظر في C #. العينات المختلفة التي وجدتها، مثل هذه, يبدو أنه يستخدم حلقة (True)، ولكن هذا النهج يؤدي إلى انفجار وحدة المعالجة المركزية في 100٪. هل هناك طريقة لاستخدام مآخذ غير الحظر باستخدام نمط برمجة الأحداث؟ شكرا

هل كانت مفيدة؟

المحلول

انظر مثال MSDN هنا. وبعد يوضح المثال كيفية تلقي البيانات غير متزامن. يمكنك أيضا استخدام طرق المقبس / EndSend لإرسال البيانات بشكل غير متزامن.

يجب أن تلاحظ أن مفوض رد الاتصال ينفذ في سياق موضوع Threadpool. هذا مهم إذا كانت البيانات المستلمة داخل رد الاتصال تحتاج إلى مشاركة مؤشر ترابط آخر، على سبيل المثال، مؤشر ترابط UI الرئيسي الذي يعرض البيانات في نموذج Windows. إذا كان الأمر كذلك، فستحتاج إلى مزامنة الوصول إلى البيانات باستخدام lock الكلمة الرئيسية، على سبيل المثال.

كما لاحظت، مع مآخذ غير الحلقية وحلقة أثناء الحلقة، يتم ربط المعالج بنسبة 100٪. لن يحصل النموذج غير المتزامن فقط على مندوب رد الاتصال عندما تكون هناك بيانات لإرسالها أو تلقيها.

نصائح أخرى

لتجنب قضية وحدة المعالجة المركزية في الثقيلة أثناء حلقة، عندما لا تتلقى بيانات thread.sleep(100) او اقل. من شأنها أن تدع عمليات التغيير الأخرى تغيير مهمة

التحدث عموما عن حظر / عدم الحظر IO، ينطبق بشكل عام:

الشيء الرئيسي هو أنه في الحياة الحقيقية يقوم برنامجك اشياء اخرى في حين لا تفعل io. يتم فرض الأمثلة جميعها بهذه الطريقة.

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

في عدم حظر IO، استعلامات مؤشر الترابط لمعرفة ما إذا كان IO ممكنا، وعلى خلاف ذلك ويفعل شيئا آخر. لذلك تقوم بعمل أشياء كثيرة بالتوازي من خلال صراحة - في مستوى التطبيق - تبادل بينهما.

socket.beginreceive و asynccallback.

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