触发事件时如何终止方法

时间:2015-06-06 06:24:53

标签: c# .net events

我有一个验证方法和一个验证计数器,当错误计数等于一个数字时,我会触发一个事件。如何终止验证过程?也许我应该使用Observer模式?

class ValidationClass
{
private int errorsCount;
private delegate void CompleteHandler();
private event CompleteHandler ValidationComplete;

public int ErrorsCount
{
     set
       {
         errorsCount = value;
         if (errorsCount == 20)
         {
          ValidationComplete();
         }
        }
       get { return errorsCount; }
}

public void ValidationClass()//constructor
{
 ValidationComplete += ExcelHelpers_Complete;
}

void Validation_Complete() // 
{
//terminate Validate() and return false; how?
}


public bool Validate()
{
                   for(...){
                       ErrorsCount++;

                        for(...){

                         ....
                         ErrorsCount++;


                  }
             ....
             //others conditions that increment ErrorsCount
         }
 }

4 个答案:

答案 0 :(得分:0)

让您的订阅者检查错误计数,如果超过您的最大范围则不执行任何操作。如果您的订阅者无权访问发布者对象,则无法在事件本身内传递计数。一旦满足此条件,您的订户也可以取消订阅。

答案 1 :(得分:0)

将以下代码移到Validate()方法中:

if (errorsCount == 20)
{
    ValidationComplete();
}

现在使用break语句在条件为真时中止循环并在此后引发ValidationComplete()事件。

您的财产将如下所示:

public int ErrorsCount
{
    set { errorsCount = value; }
    get { return errorsCount; }
}

Validate()方法如下所示:

public bool Validate()
{
    for(...){
        ErrorsCount++;
        if(Check20()) break;

        for(...){
            ....
            ErrorsCount++;
            if(Check20()) break; 
        }

        if(Check20()) break;

        ....
        //others conditions that increment ErrorsCount
        if(Check20()) break;
    }
}

private bool Check20()
{
    if(ErrorsCount==20)
    {
        ValidationComplete();
        return true;
    }
    return false;
}

如果你不喜欢所有的重复,你也可以为它创建一个小函数。

答案 2 :(得分:0)

当ErrorCount达到20时,在ErrorsCount setter中抛出一个自定义异常(或者更好的是,创建一个IncrementErrorCount()方法)然后捕获并返回。

try {
    ...
    IncrementErrorCount();
    ...
} catch(TooManyErrorsException) {
   return;
}

这是一种使用控制抛出异常的反模式,但如果这是一种特殊情况,并且如果这是一个客户端应用程序并且这不会发生在循环中,那就没问题。

答案 3 :(得分:0)

另一种方法:很难从缩略代码中判断,但如果所有检查都在循环中,您也可以将检查置于for循环条件中:

{{1}}