هو مأخذ.SendAsync موضوع آمنة بشكل فعال ؟
-
22-07-2019 - |
سؤال
كنت تافه مع سيلفرلايت TCP الاتصالات و كنت اضطر لاستخدام النظام.صافي.مآخذ.مأخذ الدرجة التي على سيلفرلايت وقت التشغيل فقط طرق غير متزامن.
كنت أتساءل ماذا يحدث إذا اثنين من المواضيع دعوة SendAsync على مأخذ توصيل سبيل المثال في وقت قصير جدا أحدهما من الآخر ؟
بلدي واحد القلق هو أن لا يكون اختلط بايت الذهاب من خلال TCP القناة.
كونها وسيلة غير متزامن أعتقد الرسالة يحصل وضعها في قائمة الانتظار من موضوع واحد dequeues لذلك لا يوجد مثل هذا سوف يحدث أشياء (اختلاط محتوى الرسالة على السلك).
ولكن أنا لست متأكدا من MSDN لا شيء في طريقة الوصف.هو أي شخص متأكد من هذا ؟
EDIT1 :لا تأمين على كائن قبل استدعاء SendAsync مثل :
lock(this._syncObj)
{
this._socket.SendAsync(arguments);
}
لن يساعد لأن هذا serializes طلبات لإرسال البيانات ليست بيانات أرسلت بالفعل.
المحلول
من أجل استدعاء SendAsync
تحتاج أولا أن يكون دعا ConnectAsync
مع مثيل SocketAsyncEventArgs
.لها مثيل SocketAsyncEventArgs
الذي يمثل العلاقة بين العميل والخادم.الدعوة SendAsync
مع نفس مثيل SocketAsyncEventArgs
التي تم استخدامها المتميز الدعوة إلى SendAsync
سوف يؤدي إلى استثناء.
فمن الممكن لجعل متعددة المعلقة المكالمات SendAsync
من نفس Socket
كائن ولكن فقط باستخدام حالات مختلفة من SocketAsyncEventArgs
.على سبيل المثال (في عالم مواز حيث أن هذا قد يكون ضروري) يمكن أن يجعل HTTP متعددة الوظائف إلى نفس الملقم في نفس الوقت ولكن على اتصالات مختلفة.هذا هو مقبول تماما وطبيعية ولا عميل ولا خادم الحصول على الخلط حول الحزمة التي.