سؤال

أنا أستخدم Networkstream & TCPClient لتلقي البيانات بشكل غير متزامن باستخدام BeginRead. أحتاج إلى تطبيق مهلة على هذه العملية ، بحيث يتم إحباط القراءة بعد فترة محددة من الوقت.

بقدر ما أتمكن من معرفة ذلك ، لا يتم دعم هذا على NetworkStream أو TCPClient - هناك خاصية requiveTimeOut ، ولكن يبدو أن هذا ينطبق فقط على المكافئ المتزامن - "قراءة".

حتى فئة المقبس الأساسية لا يبدو أنها تدعم المهلة في طريقة BeginReceive.

لقد بحثت في هذه المشكلة والقرار المقترح الوحيد الذي رأيته هو إعداد مؤشر ترابط خلفية آخر لإلغاء العملية إذا لم يكتمل خلال فترة المهلة. هذا يبدو وكأنه اختراق مروع. بالتأكيد هناك طريقة أفضل؟

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

المحلول

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

إذا كان عليك استخدام مؤشر ترابط الخلفية لإلغاء العملية ، على الرغم من ذلك ، فلن يكون هناك الكثير من الإشارة إلى الاستمرار في استخدام طرق البداية/النهاية غير المتزامنة. إذا كنت ستقوم بتدوير موضوع الخلفية ، فما عليك سوى إجراء عملية قراءة متزامنة من سلسلة رسائل الخلفية ، ثم يمكنك استخدام requiveTimeout.

نصائح أخرى

انتظر ManualResetEvent مع بعض قيمة المهلة للإشارة عند الانتهاء من مهمتك. إذا تم الإشارة إلى ذلك قبل الإشارة ، فأنت تعلم أن العملية غير المتزامنة لم تكتمل أبدًا.

private ManualResetEvent receiveDone = new ManualResetEvent(false);

receiveDone.Reset();
socket.BeginReceive(...);
if(!receiveDone.WaitOne(new TimeSpan(0, 0, 0, 30))) //wait for 30 sec.
    throw new SocketException((int)SocketError.TimedOut);

Inside BeginReceive Callback ، استخدم

private void ReceiveCallBack(IAsyncResult ar)
{
    /** Use ar to check if receive is correct and complete */
    receiveDone.Set();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top