设置值或在返回时调用函数

时间:2018-04-21 13:47:54

标签: c#

假设我有一个类似这样的函数的类:

class Util {
    public bool flagCompleted = false
    public int calc(int x, int y){
        if(x < 0 || y < 0){
            return -1; //set flagCompleted = true
        }
        if(x == 0 || y == 0){
            return 0; //set flagCompleted = true
        }
        //...
    }
}

每当我返回flagCompleted时,shold都设置为true。抛出Excenption时也应设置此标志。问题是,我的“真实”功能更大,所以我不能在每次返回之前设置这个值。

编辑:此外,计算需要一定的时间,所以我想“等待”功能完成,我的程序输出类似“等待......”的内容。 (这已经使用new Thread(() => {util.calc(...)}完成,我只需要知道它何时完成)

1 个答案:

答案 0 :(得分:4)

  

每当我返回一些flagCompleted应该设置为true。抛出异常时也应设置此标志。问题是,我的“真实”功能更大,所以我不能在每次返回之前设置这个值。

当然,这很简单:只需将你的大功能放入try-finally:

class Util {
    public bool Completed { get; private set; }
    public int Calculate(int x, int y) 
    {
        try 
        {
            blah blah blah
        }
        finally
        {
            this.Completed = true;
        }
    }
}

在返回时,finally块将在返回之后但在调用者恢复之前运行。投掷时情况稍微复杂一些;调用者中的异常过滤器在finally块之前运行,因此如果您具有必须由异常过滤器观察并在finally中设置的状态,请务必小心。这是可能的,但如果那是你的情景,可能会问另一个问题。

更新:我刚刚了解到这个机制正用于向另一个线程发出计算完成的信号。 这是用于的错误机制。如果您需要阻止此工作中的另一个线程,请使用监视器并发出另一个线程的信号。如果另一个线程与此线程异步工作,请使用任务。

此外:如果正在完成的工作是CPU绑定的,那么使用TPL将工作线程调度到空闲CPU,然后等待生成的任务。如果工作是IO绑定,则不要创建单独的线程。通过使用异步IO使整个方法异步,将整个事物保留在UI线程上,并等待生成的任务。无论哪种方式,使用任务作为您的信号机制更聪明

当您等待任务时,如果任务正常完成,那么您将获得结果并且您的工作流将恢复,如果任务以异常完成,则await将抛出,您的正常异常处理程序可以处理它。 / p>