我可以编写一个C#方法来终止任何调用它的人(在同一个类中)的执行吗?

时间:2010-11-17 02:51:00

标签: c# multithreading

我有一个C#类,通常在一个线程中执行。调用者可以调用.Cancel方法来停止执行该线程。

“。Cancel”方法将布尔“已取消”属性设置为“True”。实际取消来自这样的小块,散布在我的代码中的所有地方:

public void ThisGetsExecutedAsAThread()
{
.....

    DoThing1;
    if (Cancelled)
    {
        LogMsg = "Cancelled!";
        Finished = true;
        return;
    }
    DoThing2;
    if (Cancelled)
    {
        LogMsg = "Cancelled!";
        Finished = true;
        return;
    }
    DoThing3;
    if (Cancelled)
    {
        LogMsg = "Cancelled!";
        Finished = true;
        return;
    }
.....
}

这种方法效果很好(即调用者可以取消操作,并且执行会在几秒钟内停止),但正如您所看到的那样,它非常重复。

我想用更像这样的东西替换这些块:

...Do some action...
TerminateIfCancelled;
...Do some action....

是否可以定义一个会导致调用者返回的“TerminateIfCancelled”?

或者我错过了一些更好的解决这个问题的一般方法..?

3 个答案:

答案 0 :(得分:4)

结束线程的最佳方法是从函数返回,并且只有两种方法从函数返回 - returnthrow,所以如果你不喜欢{{1}您可以定义新的例外类型(例如if(Cancelled) return;)并将其放入CancelledException

TerminateIfCancelled

答案 1 :(得分:1)

获取您创建的线程实例并从另一个线程中止它:

Thread oThread = new Thread(new ThreadStart(someDelegate));
oThread.Start()

并在你的“CancelButton_Click”上:

oThread.Abort()

它将在Thread上引发ThreadAbortedException。您应该捕获该异常并优雅地失败。

答案 2 :(得分:1)

如果您使用TaskTask<T>

,C#将帮助您解除取消/错误/继续操作