开发者

c# - abort the execution of a method if its taking too long to run

How can I abort the execution of a method if its taking too long to run?

e.g.

string foo = DoSomethingComplex();

but if DoSomethingComplex() is taking too long (20 seconds lets say). then jus开发者_开发百科t set foo to "";


You can create a new thread running your method, then:

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

Join returns true if thread finished successfully before designated time. Obviously, would not abort the method (probably no way to do that directly), but the thread -- but it seems that would accomplish what you desired.

A simple threading code example probably would go something like below. Note I made some assumptions about signature with parameter, all this in some class, etc. For method:

    public string DoSomethingComplex(int param)

and then in the same 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);
}

usage aka code in some other method in ClassFooIsIn:

var thread = new Thread(() => ThreadedDoSomethingComplex(this, param, ThreadedDoSomethingComplexEnded));
thread.Start();

if (!thread.Join(20000))
{
     foo = "";
}

Foo should be initialized before above shown usage, so in reality you could possibly skip foo = ""; line.


Create a separate thread for DoSomethingComplex and wait for completion of the operation in the main thread:

  1. create an instance of AutoResetEvent and pass it to the thread that will execute DoSomethingComplex;
  2. use AutoResetEvent.Set() method in DoSomethingComplex to tell the main thread about completion
  3. use AutoResetEvent.WaitOne(timeout) in main thread
  4. If WaitOne returned false, use Thread.Abort() method to stop the thread if it works for too long.


You can't abort the execution of a method. What you could do is to run this method on a separate thread and abort the thread if it takes too long.


research on LiMex or Limited Execution.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜