代码之家  ›  专栏  ›  技术社区  ›  JosephStyons

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

  •  1
  • JosephStyons  · 技术社区  · 14 年前

    我有一个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....
    

    是否可以定义“TerminateIfCancelled”以使调用方返回?

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   max    14 年前

    结束线程的最好方法是从函数返回,而从函数返回的方法只有两种- return throw ,所以如果你不喜欢 if(Cancelled) 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;
        }
    }
    
        2
  •  1
  •   Cheng Chen    14 年前

    如果您使用 Task Task<T>

        3
  •  1
  •   Gerardo Grignoli    14 年前

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

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

    在“取消按钮”上:

    oThread.Abort()
    

    它将在线程上引发ThreadAbortedException。你应该抓住那个异常,优雅地失败。