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:
- create an instance of AutoResetEvent and pass it to the thread that will execute DoSomethingComplex;
- use AutoResetEvent.Set() method in DoSomethingComplex to tell the main thread about completion
- use AutoResetEvent.WaitOne(timeout) in main thread
- 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.
精彩评论