我有一个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”?
或者我错过了一些更好的解决这个问题的一般方法..?
答案 0 :(得分:4)
结束线程的最佳方法是从函数返回,并且只有两种方法从函数返回 - return
和throw
,所以如果你不喜欢{{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)