كيفية إيقاف خدمة Windows C #؟

خدمة Windows الخاصة بي يتم إنشاء 1 مؤشر ترابط في أسلوب OnStart (). يحتوي رمز سلسلة الرسائل على حلقة واحدة بينما يبدو كالتالي:

    Thread mworker;       
    AutoResetEvent mStop = new AutoResetEvent(false); 
     protected override void OnStart(string[] args)
{
   //TODO: Add code here to start your service.

    mworker = new Thread(pwd_fetch);
    mworker.IsBackground = false;
    mworker.Start();
}

protected override void OnStop()
{
   //TODO: Add code here to perform any tear-down necessary to stop your service.
    mStop.Set();
    mworker.Join();
}

private void pwd_fetch()
{
    while(true)
    {
        //some other code

        if (mStop.Set()==true)
            break;
    }
}

أريد شرط أثناء الحلقة كصحيحة ، ولكن لكسر الحلقة أنا أستخدم تعليمات if() ، ولكن لا أزال غير قادر على إيقاف الخدمة.

أي شخص يعرف ، لماذا هذا هو الحال؟ كيف يمكنني حل هذه المشكلة؟

1
ما هو mStop و Set هو خاصية أو طريقة. إذا كانت هذه الطريقة ، فسيتم إرجاع Set false في كل حالة.
وأضاف المؤلف Romil Kumar Jain, مصدر
الرجوع إلى معرفة حول Set و WaitOne باستخدام AutoresetEvent msdn.microsoft.com/EN-US/مكتبة/و hellip؛
وأضاف المؤلف Romil Kumar Jain, مصدر
Romil: تم تعديل الرمز.
وأضاف المؤلف sailer, مصدر

5 إجابة

في طريقة حلقة الخيط ، تحتاج إلى استخدام mStop.WaitOne (مع انتهاء المهلة). ستحدد مجموعة الاتصال المقبض ... هذا ليس ما تريد القيام به هنا.

 if (mStop.WaitOne(500))
     break;
2
وأضاف
كما جربت طريقة WaitOne() ، ولكن الخدمة لا تتوقف.
وأضاف المؤلف sailer, مصدر
بعد نقطة توقف التعليمات mStop.Set() يأتي mworker.join (). نقطة توقف لا تذهب إلى pwd_fetch ()
وأضاف المؤلف sailer, مصدر
أقترح إرفاق مصحح الأخطاء في الاستوديو المرئي بخدمة التشغيل الخاصة بك. تعيين breakpoints في إجراءات OnStop() و pwd_fetch() لمعرفة ما يحدث. حاول إيقاف الخدمة ومعرفة ما هي نقاط التوقف التي يتم ضربها وما يحدث. هذا ينبغي أن تفعل خدعة.
وأضاف المؤلف pilotcam, مصدر
مجرد تخمين: ربما شيء آخر هو إعادة تعيين mStop الخاص بك؟ هو AutoResetEvent .. أي انتظار (أو إعادة تعيين) سيفعل ذلك ومنع الحلقة الخاصة بك من الإنهاء. في هذه الحالة ، قد يكون حدث إعادة تعيين يدوي رهانًا أكثر أمانًا. بخلاف ذلك ، يمكنني اقتراح فقط للاحتفاظ خلال حلقة مؤشر الترابط الخاص بك مع المصحح ونرى ما يتم ضرب.
وأضاف المؤلف pilotcam, مصدر

لإيقاف الخدمة يجب عليك الاتصال بمثيل servicecontroller وإيقافه

ServiceController service = new ServiceController("ServiceName");
service .Stop();
1
وأضاف

يجب عليك إضافة رمز مؤشر الترابط الخاص بك في حدث بدء الخدمة ، وليس عند البدء.

0
وأضاف
وأيضا استخدام عامل الخلفية حتى تتمكن من إلغاء عملية السنة
وأضاف المؤلف JohnnBlade, مصدر

إذا كنت تريد أن تتوقف الخدمة عن نفسها ، فيمكنك ببساطة الاتصال بـ:

this.Stop()
0
وأضاف

1. استخدم متغيرًا منطقيًا بدلاً من "true" دائمًا أثناء التكرار بعد ذلك ، يمكنك تعيينها على "false" حيث تحتاج إلى إنهاء الرموز داخل الحلقة.

2.Call mworker.Abort() لوقف الخيط.

3. إيقاف الخدمة عن طريق

new ServiceController ("ServiceName"). Stop ()؛ </القانون>

0
وأضاف