我可以编写一个C#方法来终止调用它的任何人(在同一个类中)的执行吗?
我有一个C#类,通常在线程中执行。调用方可以调用.Cancel方法来停止线程的执行 “.Cancel”方法将布尔“Cancelled”属性设置为“True”。实际的取消来自这样的小块,分散在我的代码中:我可以编写一个C#方法来终止调用它的任何人(在同一个类中)的执行吗?,c#,multithreading,C#,Multithreading,我有一个C#类,通常在线程中执行。调用方可以调用.Cancel方法来停止线程的执行 “.Cancel”方法将布尔“Cancelled”属性设置为“True”。实际的取消来自这样的小块,分散在我的代码中: public void ThisGetsExecutedAsAThread() { ..... DoThing1; if (Cancelled) { LogMsg = "Cancelled!"; Finished = 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....
是否可以定义一个会导致调用方返回的“TerminateIfcanceled”
或者我错过了解决这个问题的更好的通用解决方案?获取您创建的线程实例,并从另一个线程中止它:
Thread oThread = new Thread(new ThreadStart(someDelegate));
oThread.Start()
在“取消按钮”上单击:
它将在线程上引发ThreadAbortedException。您应该捕获该异常并正常地失败。获取您创建的线程实例并从另一个线程中止它:
Thread oThread = new Thread(new ThreadStart(someDelegate));
oThread.Start()
在“取消按钮”上单击:
它将在线程上引发ThreadAbortedException。您应该捕获该异常并优雅地失败。C#将帮助您执行取消/错误/继续操作(如果您使用)或C#将帮助您执行取消/错误/继续操作(如果您使用)或结束线程的最佳方法是从其函数返回,从函数返回的方法只有两种-
return
和throw
,因此如果您不喜欢if(取消)返回
您可以定义新的异常类型(CancelledException
),并将其放入您的TerminateIfCancelled
:
sealed class CancelledException : Exception { }
private void TerminateIfCancelled()
{
if (Cancelled)
{
LogMsg = "Cancelled!";
Finished = true;
throw new CancelledException();
}
}
public void ThisGetsExecutedAsAThread()
{
try
{
DoThing1;
TerminateIfCancelled();
DoThing2;
TerminateIfCancelled();
DoThing3;
TerminateIfCancelled();
}
catch(CancelledException)
{
return;
}
}
结束线程的最佳方式是从函数返回,从函数返回的方式只有两种-
返回
和抛出
,所以如果您不喜欢如果(取消)返回
您可以定义新的异常类型(CancelledException
),并将其放入您的TerminateIfCancelled
:
sealed class CancelledException : Exception { }
private void TerminateIfCancelled()
{
if (Cancelled)
{
LogMsg = "Cancelled!";
Finished = true;
throw new CancelledException();
}
}
public void ThisGetsExecutedAsAThread()
{
try
{
DoThing1;
TerminateIfCancelled();
DoThing2;
TerminateIfCancelled();
DoThing3;
TerminateIfCancelled();
}
catch(CancelledException)
{
return;
}
}
这似乎是一个很好的答案,但它应该是调用程序中的verthread.Abort(),否则您只需编写if(取消){CurrentThread.Abort()}即可。这就是我编辑答案的要点。感谢您指出。这似乎是一个很好的答案,但它只能是调用程序中的whateverThread.Abort(),否则您只需编写if(取消){CurrentThread.Abort()}即可。这就是重点,为了清楚起见,我编辑了答案。谢谢您的指点。您能不能进一步简化这个过程并抛出CanceledException而不是调用TerminateIfcCancelled()?然后在catch块中设置LogMsg=“Cancelled”并Finished=true。您不能进一步简化它,只抛出CancelledException而不是调用TerminateIfCancelled()?然后在catch块中设置LogMsg=“Cancelled”和Finished=true。