c#-如果某个方法的运行时间太长,则中止该方法的执行

c#-如果某个方法的运行时间太长,则中止该方法的执行,c#,.net,C#,.net,如果某个方法的运行时间太长,如何中止该方法的执行 e、 g 但是如果DoSomethingComplex()花费的时间太长(比如说20秒)。 然后将foo设置为“” 不能中止方法的执行。您可以在单独的线程上运行此方法,如果需要的时间太长,则中止该线程。为DoSomethingComplex创建单独的线程,并等待主线程中的操作完成: 创建的实例并将其传递给将执行DoSomethingComplex的线程 在DoSomethingComplex中使用AutoResetEvent.Set()方法告诉主

如果某个方法的运行时间太长,如何中止该方法的执行

e、 g

但是如果
DoSomethingComplex()
花费的时间太长(比如说20秒)。
然后将foo设置为“”

不能中止方法的执行。您可以在单独的线程上运行此方法,如果需要的时间太长,则中止该线程。

为DoSomethingComplex创建单独的线程,并等待主线程中的操作完成:

  • 创建的实例并将其传递给将执行DoSomethingComplex的线程
  • 在DoSomethingComplex中使用AutoResetEvent.Set()方法告诉主线程有关完成的信息
  • 在主线程中使用AutoResetEvent.WaitOne(超时)
  • 如果WaitOne返回false,则如果线程工作时间过长,请使用方法停止线程

  • 研究LiMex或有限执行。

    您可以创建一个运行您的方法的新线程,然后:

    thread.Start();
    bool success = thread.Join(20000);
    
    如果线程在指定时间之前成功完成,Join返回true。显然,它不会中止该方法(可能没有直接中止的方法),而是中止该线程——但它似乎可以实现您想要的

    一个简单的线程代码示例可能如下所示。注:我对带参数的签名做了一些假设,所有这些都在某个类中,等等。对于方法:

        public string DoSomethingComplex(int param)
    
    然后在同一个班级:

    public delegate void Callback(string newFoo);
    
    public void ThreadedDoSomethingComplexEnded(string newFoo)
    {
        foo = newFoo;
    }
    
    private static void ThreadedDoSomethingComplex(ClassFooIsIn fooObject, int param, Callback callback)
    {
        var newFoo = fooObject.DoSomethingComplex(param);
        callback(newFoo);
    }
    
    ClassFooIsIn中其他方法中的代码用法:

    var thread = new Thread(() => ThreadedDoSomethingComplex(this, param, ThreadedDoSomethingComplexEnded));
    thread.Start();
    
    if (!thread.Join(20000))
    {
         foo = "";
    }
    

    Foo应该在上面显示的用法之前初始化,所以实际上您可能会跳过Foo=“”;行。

    您可以将DoSomethingComplex()作为线程运行吗?请查看本文,了解一些有趣的解决方案:不建议中止线程。如果可能的话,在一个单独的AppDomain中运行这个线程。你真的应该在DoSomethingComplex()中解决这个问题。
    var thread = new Thread(() => ThreadedDoSomethingComplex(this, param, ThreadedDoSomethingComplexEnded));
    thread.Start();
    
    if (!thread.Join(20000))
    {
         foo = "";
    }