قد توفر بعض المكتبات طرقًا غير متزامنة فقط، ولكن ASP.net متزامن بالفعل. هذه المرة واجهنا مشكلة: لن يتم تنفيذ وظيفة رد الاتصال حتى يتم عرض الصفحة. والعملية التي أحتاجها هي: إجراء التحقق في وظيفة رد الاتصال قبل عرض الصفحة. يوفر Mutex وAutoResetEvent طرقًا لتنسيق خطوات تنفيذ مؤشر الترابط من خلال الإشارات.
XmppClientConnection هي فئة في مكتبة agsxmppJabber، وسيعود Calling Open على الفور إلى العميل (على سبيل المثال) لعرض الصفحة، بغض النظر عما إذا كانت ناجحة أم لا، وفي الوقت نفسه، سيقوم مؤشر ترابط آخر بإجراء عمليات تسجيل الدخول والحساب الجديد. بعد النجاح، سيتم تشغيل حدث رد الاتصال، لذلك لن يتم تنفيذ رد الاتصال إلا بعد عرض الصفحة، وهو ما لا يتوافق مع المنطق الذي نريده. نحن نسمي الخيط الذي يستدعي فتح: خيط Jabber، والخيط الذي يقوم بتسجيل الدخول: الخيط المساعد لخيط Jabber.
كانت فكرتي الأولية هي استخدام الكود Monitor:
كائن خاص objlock=كائن جديد () ؛
الفراغ العام RegisterJab (اسم مستخدم السلسلة، كلمة مرور السلسلة، خادم السلسلة)
{
_connection.Server = الخادم؛
_connection.Username = username;
_connection.Password = كلمة المرور؛
_connection.Port = 80;
_connection.UseSSL = false;
_connection.AutoResolveConnectServer = true;
_connection.ConnectServer = null;
_connection.SocketConnectionType = agsXMPP.net.SocketConnectionType.Direct;
_connection.UseStartTLS = true;
_connection.RegisterAccount = true;
Moniter.Enter(objlock);
_connection.Open();
Moniter.Wait(objlock);
_connection.Close()
}
الفراغ الخاص XmppCon_OnRegistered (مرسل الكائن)
{
IsSuccessfull = true;
Moniter.Exit(objlock);
}
سيتم طرح استثناء عند تنفيذ Monitor.Exit(): SynchronizationLockException، لأن مؤشر ترابط Jabber المساعد ليس هو مالك القفل. وقد وجد أن جهاز المراقبة يشبه القسم الحرج وغير مناسب للتعامل مع هذا الموقف.
تم نقله لاحقًا إلى Mutex، Mutex: هو بدائي مزامنة يمنح الوصول الحصري إلى مورد مشترك لمؤشر ترابط واحد فقط. إذا حصل أحد الخيوط على كائن المزامنة (mutex)، فسيتم تعليق الخيط الثاني الذي يحصل على كائن المزامنة (mutex) حتى يقوم الخيط الأول بتحرير كائن المزامنة (mutex).
يعتبر Mutex مناسبًا جدًا لتحقيق هذه الوظيفة، ولكن هل هناك طريقة أسهل؟ هذا هو AutoResetEvent: السماح للخيوط بالتواصل مع بعضها البعض عن طريق الإشارة. عادةً ما يتضمن هذا الاتصال الموارد التي يحتاج مؤشر الترابط إلى وصول خاص إليها. الشيء الأكثر أهمية هو أنه يوفر طريقة للاتصال بين الخيوط، بحيث يمكن التحكم في خطوات الاتصال الخاصة بالخيط بشكل أكثر مرونة. ما نستخدمه هو الإشارة.
شفرة:
قاعدة تسجيل الدخول لمساحة الاسم
{
سجل الطبقة العامة
{
XmppClientConnection_connection;
static AutoResetEvent myResetEvent;
المجمع العام IsUsed؛
تسجيل عام ()
{
_connection = new XmppClientConnection();
_connection.SocketConnectionType = agsXMPP.net.SocketConnectionType.Direct;
_connection.OnLogin += new ObjectHandler(XmppCon_OnLogin);
_connection.OnRegisterError += new OnXmppErrorHandler(XmppCon_OnRegErr);
_connection.OnRegistered += new ObjectHandler(XmppCon_OnRegistered })
;
المنطق العام IsSuccessfull = false;
الفراغ العام RegisterJab (اسم مستخدم السلسلة، كلمة مرور السلسلة، خادم السلسلة)
{
_connection.Server = الخادم؛
_connection.Username = username;
_connection.Password = كلمة المرور؛
_connection.Port = 80;
_connection.UseSSL = false;
_connection.AutoResolveConnectServer = true;
_connection.ConnectServer = null;
_connection.SocketConnectionType = agsXMPP.net.SocketConnectionType.Direct;
_connection.UseStartTLS = true;
_connection.RegisterAccount = true;
myResetEvent = new AutoResetEvent(false);
_connection.Open();
myResetEvent.WaitOne(20 * 1000, true);
_connection.Close()
}
الفراغ الخاص XmppCon_OnRegistered (مرسل الكائن)
{
IsSuccessfull = true;
myResetEvent.Set();
}
XmppCon_OnLogin الخاص باطل (مرسل الكائن)
{
IsSuccessfull = true;
myResetEvent.Set();
}
الفراغ الخاص XmppCon_OnRegErr (مرسل الكائن، العنصر e)
{
// إذا كان رمز الخطأ هو 409، فهذا يعني أن المستخدم موجود بالفعل
IsSuccessfull = false;
العنصر xn = e.SelectSingleElement("خطأ");
إذا (xn.Attribute("code") == "409")
مستخدم = صحيح؛
myResetEvent.Set()
}
}
}
قم أولاً بتعيينه على حالة غير منتهية، ثم أدخل مؤشر ترابط Jabber، وقم بحظر مؤشر ترابط Asp، وانتظر المهلة 20 ثانية. إذا تم تشغيل حدث رد الاتصال، فسيتم تعيين الحالة على إنهاء ويستمر مؤشر ترابط asp في التنفيذ.
تمت المزامنة بنجاح، بحيث لن يستمر مؤشر ترابط Asp حتى ينتهي تنفيذ مؤشر ترابط Jabber المساعد.
http://www.cnblogs.com/bluewater/archive/2006/08/14/476720.html