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)
。这对于他想要的东西来说非常复杂