كيف يمكنني الحفاظ على وحدة مفتوحة حتى CancelKeyPress الحدث هو مطرود ؟

StackOverflow https://stackoverflow.com/questions/203246

  •  03-07-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة للحفاظ على وحدة تطبيق مفتوح طالما CancelKeyPress الحدث لم أطلق النار ؟

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

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

المحلول

أنا على افتراض أن "بأمان إيقاف تطبيق" هو جزء كنت تعاني من هنا.وإلا التطبيق الخاص بك تلقائيا الخروج على ctrl-c.يجب تغيير العنوان.

هنا عرض سريع ما أعتقد تحتاج إليها.يمكن أن يتم تكريره أكثر قليلا مع استخدام قفل شاشات الإعلام.لست متأكدا بالضبط ما تحتاجه على الرغم من ذلك أنا فقط أطرح هذا...

class Program
{

    private static volatile bool _s_stop = false;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
        while (!_s_stop)
        {
            /* put real logic here */
            Console.WriteLine("still running at {0}", DateTime.Now);
            Thread.Sleep(3000);
        }
        Console.WriteLine("Graceful shut down code here...");

        //don't leave this...  demonstration purposes only...
        Console.ReadLine();
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        //you have 2 options here, leave e.Cancel set to false and just handle any
        //graceful shutdown that you can while in here, or set a flag to notify the other
        //thread at the next check that it's to shut down.  I'll do the 2nd option
        e.Cancel = true;
        _s_stop = true;
        Console.WriteLine("CancelKeyPress fired...");
    }

}

على _s_stop منطقية يجب أن تعلن متقلبة أو مفرط في الطموح محسن قد تسبب البرنامج في حلقة بلا حدود.

نصائح أخرى

ويجب أن أعلن منطقية _s_stop تقلبا في المثال الرمز، أو محسن مفرطة في الطموح قد يسبب البرنامج لحلقة لا نهاية.

وهناك بالفعل معالج بد أن CancelKeyPress أن ينهي طلبك، والسبب الوحيد لربط لأنه إذا كنت ترغب في اعتراض الحدث ومنع التطبيق من الإغلاق.

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

وببساطة تشغيل برنامج أو رموز دون تصحيح، على مفتاح لوحة المفاتيح الخاصة بك في CTRL + F5 بدلا من F5 (التصحيح).

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