假设我有一个类似这样的函数的类:
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(...)}
完成,我只需要知道它何时完成)
答案 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>