C#为什么在信号处理程序捕获外部事件后主进程会继续?

问题描述

我想将程序的所有控制权交给事件处理程序(ConsoleCancelEventHandler)。但是,一旦我在 Globals.object1.runprocess() 正在执行时通过 CTRL-C 终止整个程序,流程就会按预期进入事件处理程序,但主进程会继续处理 object1,然后处理程序才能从中检索信息对象 1。处理程序中的 try catch 块在检查 object1.Status 时可以正常工作,因为可以看到在状态可用之前抛出的异常。此代码仅在我在调试模式下运行时才能正常工作,或者如果我添加了正确的延迟在 Globals.object1.runprocess() 之后,我在该延迟内终止了程序。我如何确保流程仅在处理程序内的进程上而不是在主进程上继续?

using System;
using ownlibraryfoo;

public static class Globals
{    
    public static foo_type object1;
}

class sample_cs
{
    static void Main(string[] args)
    {

        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);

        try {
                       
            Globals.object1.initialize();

            Globals.object1.runprocess();           
      
            Globals.object1.dispose();
            
        } catch (fooException e) {
                Console.WriteLine("Error code SSSSSSSSSSSSSSSS: " + e.ErrorCode + ". " + e.Message);
            }

        return;
    }

    static void Console_CancelKeyPress(object sender,ConsoleCancelEventArgs e)
    {           
        Console.WriteLine("Program Terminated Manually");
        e.Cancel = true;
        
        Globals.object1.Terminate();
        
        bool tryAgain = true;
        /* query solve status until available and handle exception when not available */
        while(tryAgain)
        {
            try
            {
                if (Globals.object1.Status == FOOINTERRUPTEDSTATUS)               
                {                    
                     Console.WriteLine(" OBJECTIVE = " + Globals.object1.internalattribute);  
                }
         
                tryAgain = false;
            }
            catch (FooException f)
            {
                /* the error output is optional */
                Console.WriteLine("Object1 Error code = " + f.ErrorCode);
                Console.WriteLine(f.Message);
            }
        }        
        Environment.Exit(0);
    }
}


解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)