c# – 如果运行时间过长,则中止方法的执行

如果运行时间过长,我怎样才能中止方法的执行?

例如

string foo = DoSomethingComplex(); 

但是如果DoSomethingComplex()花了太长时间(20秒就可以了)。 然后只需将foo设为“”;

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

 thread.Start(); bool success = thread.Join(20000); 

如果线程在指定时间之前成功完成,则Join返回true。 显然,不会中止该方法(可能没有办法直接这样做),但线程 – 但它似乎会完成你想要的。

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

  public string DoSomethingComplex(int param) 

然后在同一个class级:

 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创建一个单独的线程,并等待主线程中的操作完成:

  1. 创建一个AutoResetEvent实例并将其传递给将执行DoSomethingComplex的线程;
  2. 在DoSomethingComplex中使用AutoResetEvent.Set()方法告诉主线程完成
  3. 在主线程中使用AutoResetEvent.WaitOne(timeout)
  4. 如果WaitOne返回false,则使用Thread.Abort()方法停止线程,如果它运行的时间太长。

您无法中止方法的执行。 你可以做的是在一个单独的线程上运行这个方法,如果花了太长时间就中止线程。

关于LiMex或有限执行的研究。