سؤال

أتلقى استثناء متابعة:

System.NotSupportedException : This stream does not support seek operations.
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.WriteByte(Byte value)

تبين رابط التالي أن هذه مشكلة معروفة لمايكروسوفت.http://connnect.microsoft.com/visualstudio/feedback/viewfeedback.aspx؟feedbackid=273186.

هذا stacktrace عرض 2 الأشياء:

  1. system.io.bufferedstream تفعل بعض عمليات نقل مؤشر سخيف. يجب أن يكون المخزن المؤقت مخزن الدفق الأساسي وليس أكثر. جودة المخزن المؤقت ستكون سيئة إذا كانت هناك مثل هذه العملية.
  2. لن تعمل أبدا مستقرة مع دفق لا يدعم البحث عنه.

هل هناك أي بدائل؟ هل أحتاج إلى عازلة جنبا إلى جنب مع مجالات الظرية في C # أو هل هذا مخزن مؤقتا بالفعل.

تحرير: أريد ببساطة تقليل عدد مكالمات القراءة / الكتابة إلى دفق المقبس الأساسي.

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

المحلول

الحل هو استخدام اثنين مستقلة BufferedStreamS، واحد لاستقبال واحد للإرسال. ولا تنس أن تدفع الإرسال BufferedStream بشكل مناسب.


نظرا لأنه حتى في عام 2018، يبدو من الصعب الحصول على إجابة مرضية على هذا السؤال، من أجل البشرية، إليك سنتان:

ال NetworkStream يكون مخزنة على جانب نظام التشغيل. ومع ذلك، فإن هذا لا يعني أنه لا توجد أسباب للتعاملين على جانب .NET. يتصرف TCP جيدا على قراءة الكتابة (كرر)، ولكن الأكشاك على قراءة الكتابة بسبب تأخر ACK، إلخ، إلخ.

إذا كنت، مثلي، لديك مجموعة من قانون البروتوكولات الفرعية في القرن العشرين، فأنت تريد المخزن المؤقت.

بدلا من ذلك, ، إذا التزمت أعلاه، فيمكنك أيضا قراءة / RCVS فقط أو يكتب / يرسل فقط، واستخدم NetworkStream مباشرة على الجانب الآخر، اعتمادا على كيفية كسر الكود. عليك فقط أن تكون متسقة!

ماذا BufferedStream المستندات تفشل في جعل واضحة وكأنها يجب عليك فقط التبديل القراءة والكتابة إذا كان تيارك قابل للبحث. وبعد هذا لأنه يخزن المؤشرون ويكتسب في نفس المخزن المؤقت. BufferedStream ببساطة لا يعمل بشكل جيد ل NetworkStream.

نظرا لأن مارك أشار إلى الخارج، فإن سبب هذا العرج هو تقلص اثنين من التدفقين في شبكة واحدة لا تعد واحدة من أعظم قرارات التصميم .NET.

نصائح أخرى

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

إذا كنت تشعر بالقلق إزاء الحجب، فيمكنك إلقاء نظرة على تبديل المقبس الأساسي إلى وضع عدم الحجب.

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

لماذا تحتاج إلى البحث؟ ربما نسخ الدفق إلى شيء يطلب أولا - أ MemoryStream أو أ FileStream - ثم القيام بعملك الفعلي من تلك الدفق الثاني القابل للتشرجل.

هل لديك غرض معين في الاعتبار؟ قد أكون قادرا على اقتراح خيارات أكثر ملاءمة بمزيد من التفاصيل ...

على وجه الخصوص: لاحظ ذلك NetworkStream هو فضول - مع معظم الجداول، القراءة / الكتابة تتعلق بنفس الدفق البدني؛ ومع ذلك، أ. NetworkStream يمثل فعلا اثنين من أنابيب مستقلة تماما؛ القراءة والكتابة لا علاقة لها تماما. وبالمثل، لا يمكنك البحث عن البايتات التي قد مضفر بالفعل ... يمكنك يتخطى البيانات، ولكن هذا أفضل القيام به عن طريق القيام ببعض Read فتحات التهيم وتخلص البيانات.

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