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

我可以编写一个C#方法来终止调用它的任何人(在同一个类中)的执行吗?,c#,multithreading,C#,Multithreading,我有一个C#类,通常在线程中执行。调用方可以调用.Cancel方法来停止线程的执行 “.Cancel”方法将布尔“Cancelled”属性设置为“True”。实际的取消来自这样的小块,分散在我的代码中: public void ThisGetsExecutedAsAThread() { ..... DoThing1; if (Cancelled) { LogMsg = "Cancelled!"; Finished = true;

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

“.Cancel”方法将布尔“Cancelled”属性设置为“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。