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

时间:2011-01-22 15:15:34

标签: c# .net

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

e.g。

string foo = DoSomethingComplex();

但如果DoSomethingComplex()花费太长时间(20秒就可以说)。 然后将foo设置为“”;

4 个答案:

答案 0 :(得分:5)

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

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 =“”;线。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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