كيف نتخلص من waithandle بشكل صحيح
-
01-10-2019 - |
سؤال
أقوم ببعض الخيوط المتعددة وأستخدم Autoresetevents و ManualResetevents تتحكم في حلقة الرئيسية الخاصة بي. عندما "destryoing" الخيوط التي يتعين عليّ التخلص منها أيضًا ، هذا واضح.
لكنني رأيت طرقًا مختلفة كيفية التخلص من Waithandles ، ولست متأكدًا من أي منها صحيح:
النسخة 1
if (disposing)
{
this.threadExitEvent.SafeWaitHandle.Dispose();
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
الإصدار 2
if (disposing)
{
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
الإصدار 3
if (disposing)
{
this.threadExitEvent.Close();
....
}
المحلول
الإصدار 2 هو ما سأذهب إليه ، حيث لا توجد حاجة إلى التمسك بها حديثًا WaitHandle
, ، لذا وضعه على null
فكرة جيدة. هذا أيضًا يجعل من الأسهل تكييف كائنك القدرة على التعافي من التخلص منه ، لأن كل ما عليك فعله هو التحقق لمعرفة ما إذا كان WaitHandle
هو لاغية وإعادة إنشائها إذا كان الأمر كذلك.
ومع ذلك ، لن يصفع أحد يدك للذهاب مع الخيار 3.
لا تستخدم الخيار 1 ؛ إنها فكرة سيئة بشكل عام "الوصول إلى الداخل" من الأشياء والبدء في التخلص من الأعضاء. الدعوة Close
(منذ Dispose
طريقة من IDisposable
يتم تنفيذها بشكل صريح ولديه رمز متطابق ل Close
) تلقائيا رعاية التخلص من SafeWaitHandle
. لا تفعل ذلك بنفسك.