سؤال

لا بد لي من استخدام واجهة برمجة التطبيقات لإجراء مكالمة إلى طرف ثالث ، واستخدام الاستجابة التي تعودها بشكل مثالي. تحتوي واجهة برمجة التطبيقات على مهلة مدتها 30 ثانية ، ولا تسمح لك بتعيين ذلك برمجيًا. أحتاجها إلى وقت الخروج في 12 ثانية. ها هي المكالمة التي أجريها:

استجابة السلسلة = theapi.functiona (A ، B ، C ، D) ؛

كنت أفكر أنني قد أحتاج إلى استخدام المكالمات ASYNC لإنجاز هذا وإحباط الخيط في 12 ثانية. يبدو أن سؤال آخر stackoverflow يقترب مما أفكر فيه: تنفيذ مهلة C# العامة

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

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

المحلول

تعتبر المواضيع الإجهاض فكرة سيئة بشكل عام. لماذا لا تدع المكالمة تكمل (أو الوقت بعد 30 ثانية) ولكن تجاهل النتيجة (والمضي قدمًا) إذا استغرق الأمر أكثر من 12 ثانية؟

نصائح أخرى

Thread.Abort سيغلق الخيط ، بالطبع ، لأنه سيتصل بـ Win32 TerminateThread.

تعتمد نتيجة هذا الإجراء على كيفية API يحب أن يتم إغلاقه بواسطة TerminateThread.

إذا تسمى طريقتك شيء مثل NuclearPlant.MoveRod() أو Defibrillator.Shock(), ، أفضل الانتظار هذه 30 ثانية.

هذه الطريقة لا تعطي أي فرصة للضحية للقيام ببعض التنظيف:

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

كما جاء في MSDN:

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

  • إذا كان الخيط الهدف يمتلك قسمًا مهمًا ، فلن يتم إصدار القسم الحرج.
  • إذا كان الخيط الهدف هو تخصيص الذاكرة من الكومة ، فلن يتم إصدار قفل الكومة.
  • إذا كان الخيط الهدف ينفذ بعض مكالمات kernel32 عند إنهاءه ، فقد تكون حالة kernel32 لعملية الخيط غير متسقة.
  • إذا كان الخيط المستهدف يتلاعب بالحالة العالمية لـ DLL المشترك ، فيمكن تدمير حالة DLL ، مما يؤثر على المستخدمين الآخرين في DLL.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top