C# MVC如何中止方法执行?

C# MVC如何中止方法执行?,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个方法,如果发生某种情况,我想中止它的执行 最简单的情况是 public bool myFlag = true; public bool MyMethod(/*args*/) { if(myFlag) { //do some stuff #1 } else return false; if(myFlag) { //do some stuff #2 } else r

我有一个方法,如果发生某种情况,我想中止它的执行

最简单的情况是

public bool myFlag = true;

public bool MyMethod(/*args*/)
{
    if(myFlag)
    {
       //do some stuff #1
    }
    else
        return false;

    if(myFlag)
    {
       //do some stuff #2
    }
    else
        return false;

    //etc
} 
但问题是,我的MyTod中有太多的代码,我不想在每一行中检查
myFlag
,因为代码会被弄乱,很难理解。我想知道如何简化这个场景,但我没有任何想法


我正在考虑将该方法放在单独的
线程中,但是UI必须等到操作完成,而且metod内部有I/O操作(如果有关系的话)

看起来您需要使用,除非我有误解,这与您的示例不完全相同,但只需要一个条件检查:

public bool MyMethod(/*args*/)
{
     if(!myFlag)
          return false;

     //Rest of glorious code!
}

检测到中止条件时,只需从方法返回,而不是设置标志。如果这仍然留下一个笨拙的方法,那么问题很可能是其中有太多的代码!确定工作单元并将其重构为单独的子方法。

这就是我处理此类需求的方式:基本上,我将方法分解并创建许多子方法,然后使用异常来调节流程(我发现这是功能性和可读性之间的最佳折衷)

看起来是这样的:

private void performFirstStep(/*args*/)
{
    //do stuff, throw if something goes wrong
}
private void performSecondStep(/*args*/)
{
    //do stuff, throw if something goes wrong
}

public bool MyMethod(/*args*/)
{
    try
    {
        // each method is supposed to represent a single Unit Of Work
        performFirstStep(/*args*/);
        performSecondStep(/*args*/);
        performThirdStep(/*args*/);
        return true;
    }
    catch(Exception ex) // I usually craft a custom exc. type to use here
    {
        // overly simplified catch block: you'll probably want
        // to *not* swallow the exceptions coming from the inside methods...
        // lots of possibilities here to easen debug
        return false;
    }
} 

您也可以创建方法
bool
并使用它们的返回值,但无论如何您都需要尝试catch,以便您可以利用它。

向我确认,以检查我是否理解
MyMethod
将在一个线程中执行,而
myFlag
可以在另一个线程中设置?不,我现在不使用thread类,这只是猜测,但是如果变量
myFlag
不是易变的(可以在上下文中更改),为什么需要多次检查它?因为无论编译器在该方法中的什么位置,该方法都必须中止其执行。如果我只在该方法的第1行检查myFlag,并且编译器位于例如第10行,则执行将更进一步,不会中止,因此
myFlag
必须由
MyMethod
中的一些调用设置。如果你认为代码“MyFLAG/<代码>”的每一个点都可能作为“步骤”的结尾而改变,那么这些步骤又有什么共同点呢?如果你能把它转换成一个循环结构,你只需要
while(myFlag)
。这对于他想要的东西来说非常复杂