C# 使用事件或..从类执行返回。。?

C# 使用事件或..从类执行返回。。?,c#,winforms,class,events,event-handling,C#,Winforms,Class,Events,Event Handling,我将提供一个简单的例子来说明我正在尝试做什么——希望这是可能的 我基本上有一个类,它对数据进行了大量的格式化/分析。因此,这可能会导致很多问题。我遇到的问题是当事情出错时如何处理课堂。我希望一旦发生错误,该类的所有执行都停止 该类(AnalyzingStuff)是从父窗体调用的,该父窗体根据该类执行的结果执行各种操作 理想情况下,我会触发一个名为say“ABORT”的事件 因此,在此代码中,我执行以下操作: Class AnalyzingStuff{ public event EventHan

我将提供一个简单的例子来说明我正在尝试做什么——希望这是可能的

我基本上有一个类,它对数据进行了大量的格式化/分析。因此,这可能会导致很多问题。我遇到的问题是当事情出错时如何处理课堂。我希望一旦发生错误,该类的所有执行都停止

该类(AnalyzingStuff)是从父窗体调用的,该父窗体根据该类执行的结果执行各种操作

理想情况下,我会触发一个名为say“ABORT”的事件

因此,在此代码中,我执行以下操作:

Class AnalyzingStuff{

public event EventHandler ABORT;

public AnalyzingStuff(){

    for(int i = 0; i < 999999; i ++){
        AnalyzeSomeStuff();
        AnalyzerSomeOtherStuff();
    }
    MoreStuff();
    OtherStuff();
}

private void AnalyzeSomeStuff(){
   if(someconditionNotMet){
        //EXIT OUT OF THIS CLASS, STOP EXECUTION!!!
        this.ABORT.Invoke(this, null);
   }
}
}
Class AnalyzingStuff{

public AnalyzingStuff(){

    for(int i = 0; i < 999999; i ++){
        if (!AnalyzeSomeStuff() || !AnalyzerSomeOtherStuff())
            break;
    }
    MoreStuff();
    OtherStuff();
}

private bool AnalyzeSomeStuff(){
   if(someconditionNotMet){
       return false;
   }
return true;
}
}
类分析程序{
公共事件事件处理程序中止;
公共分析{
对于(int i=0;i<999999;i++){
分析某物();
AnalyzerSomeOtherStuff();
}
MoreStuff();
其他材料();
}
私有void analyzesomething(){
如果(某些条件未满足){
//退出该类,停止执行!!!
this.ABORT.Invoke(this,null);
}
}
}
调用这个'ABORT'事件,我将停止这个类的执行(停止循环,不做任何其他事情)。我还可以在其他父窗体中捕获此事件处理程序。不幸的是,我找不到任何方法来停止这个类的执行

迄今为止的想法:

  • 显而易见的答案是简单地设置一个标志,并在多个地方反复检查这个标志,但我真的不喜欢这种方法(我当前的实现)。在每次方法调用(有很多)后都必须检查这一点,这在代码方面是很糟糕的

  • 我想也许是一个背景工作者或者什么你可以取消嫁妆的人

  • 使用表单作为AnalyzingStaff的基类,这样我就可以简单地调用“this.Close();”

  • 你认为解决这种情况的最佳方法是什么?这些是最好的解决方案吗?对于我想要的东西,还有其他优雅的解决方案吗?还是我完全走错了方向


    编辑:我在整个代码中使用了一系列try/catch块,用于处理可能发生的不同错误。不幸的是,并不是所有这些都要求中止,所以需要立即捕获它们。因此,try/catch不是最理想的方法。。或者是吗?

    如果出现问题,是否可以抛出一个异常,并在循环中调用该方法的地方运行try-catch

    如果您这样做,您可以在类失败时执行一些操作(您将把这些操作放在catch中),并且可以在完成时关闭与数据库++的连接

    或者,您可以让这些方法返回一个int,以判断该方法的执行是否有效。例如,返回0;如果执行有效,则返回1-500可能是不同的错误代码。或者你也可以选择简单的传球方式。如果需要从错误代码以外的方法返回值,可以将这些值作为变量传递出去。例如:

    Class AnalyzingStuff{
    
    public event EventHandler ABORT;
    
    public AnalyzingStuff(){
    
        for(int i = 0; i < 999999; i ++){
            AnalyzeSomeStuff();
            AnalyzerSomeOtherStuff();
        }
        MoreStuff();
        OtherStuff();
    }
    
    private void AnalyzeSomeStuff(){
       if(someconditionNotMet){
            //EXIT OUT OF THIS CLASS, STOP EXECUTION!!!
            this.ABORT.Invoke(this, null);
       }
    }
    }
    
    Class AnalyzingStuff{
    
    public AnalyzingStuff(){
    
        for(int i = 0; i < 999999; i ++){
            if (!AnalyzeSomeStuff() || !AnalyzerSomeOtherStuff())
                break;
        }
        MoreStuff();
        OtherStuff();
    }
    
    private bool AnalyzeSomeStuff(){
       if(someconditionNotMet){
           return false;
       }
    return true;
    }
    }
    
    类分析程序{
    公共分析{
    对于(int i=0;i<999999;i++){
    如果(!AnalyzeSomeStuff()| |!AnalyzerSomeOtherStuff())
    打破
    }
    MoreStuff();
    其他材料();
    }
    私人bool analyzesomething(){
    如果(某些条件未满足){
    返回false;
    }
    返回true;
    }
    }
    

    您当然可以使用您的事件。为了简单起见,我删除了它。

    不要在构造函数中使用analysys。在main Analyze()方法中执行此操作

    使用异常。如果由于致命错误而要中止,请引发致命异常。也就是说,抛出一个在主分析方法范围内未捕获的异常

    class Analyzer
    {
        public Analyzer()
        {
            // initialize things                
        }
    
        public void Analyze()
        {
            // never catch a fatal exception here
            try
            {
                AnalyzeStuff();
                ... optionally call more methods here ...
            }
            catch (NonFatalException e)
            {
                // handle non fatal exception
            }
    
            ... optionally call more methods (wrapped in try..catch) here ...
        }
    
        private void AnalyzeStuff()
        {
            // do stuff
            if (something nonfatal happens)
                throw new NonFatalException();
    
            if (something fatal happens)
                throw new FatalException();
        }
    }
    
    外部:

    {
        var analyzer = new Analyzer();
        try
        {
            analyzer.Analyze();
        }
        catch (FatalException)
        {
            Console.WriteLine("Analysis failed");
        }
    }
    
    如果您不喜欢以这种方式使用异常,您可以通过让每个分析方法返回bool来完成相同的任务:

    if (!AnalyzeStuff())
        return false;
    if (!AnalyzeMoreStuff())
        return false;
    ...
    return true;
    

    但最终会有很多返回语句或大括号。这是风格和偏好的问题。

    有效的解决方案。我唯一的问题是,我使用了一系列的try-and-catch来获取可能发生的其他异常。并非所有这些我都希望发生中止。更新了答案,并使用了另一种不使用异常的方式。