سؤال

من أجل الحصول على النظام.خيوط.ThreadStateException عند محاولة تشغيل مؤشر ترابط.الرمز في السؤال هو كما يلي:

// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{ 
    Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{ 
    this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{ 
    this.mThread.Start(60000); 
}
else
{   
    this.mThread.Start(0); 
}

حتى سؤالين - هل هذا هو الطريق الصحيح للقيام بهذه الأمور, و هو, هل هناك طريقة لمنع الخطأ من الحدوث ؟

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

المحلول

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

يجب تنظيم التعليمات البرمجية الخاصة بك حتى .تبدأ مضمونة إلا أن يسمى على كائنات جديدة.باختصار, يجب أن تضع بداية طريقة في نفسه إذا-بيان واحد أن ينشئ موضوع جديد كائن.

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

نصائح أخرى

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

if((mThread.ThreadState & ThreadState.Running) != 0)

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

mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
    mThread.Start(60000);
else
    mThread.Start(0);

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

جون.

أ ThreadStateException يتم طرح لأنك تحاول بدء تشغيل مؤشر ترابط هذا ليس في قابل للتشغيل يوجد الدولة.الحالات الأكثر احتمالا أن يكون انها قيد التشغيل بالفعل ، أو أنه قد بالكامل وخرجت.

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

الاحتمال الآخر هو أن الموضوع تم إحباط.المواضيع التي يتم إحباط انتقل إلى حالة إحباط ، وليس توقفت الدولة ، وبالطبع أيضا لا تصح إعادة تشغيل.

حقا, فقط نوع من الترابط الذي لا يزال على قيد الحياة يمكن أن يكون "إعادة تشغيل" هو واحد مع وقف التنفيذ.قد ترغب في استخدام هذا الشرطي بدلا من ذلك:

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

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