I have created a timeout function based on things I have seen in various places but am pretty sure I am not doing it a great way! (But it does seem to work.)
I am connecting to a piece of hardware that if working connects in a few seconds but if not takes around 1 minute to timeout. So if I can create my own timeout function I can set it at 20 seconds and save lots of time and waiting.
I have tried to make it so my timeout returns a string:
static string CallWithTimeout(Action action, int timeoutMilliseconds)
{
string reply = "";
Thread threadToKill = null;
Action wrappedAction = () =>
{
threadToKill = Thread.CurrentThread;
action();
};
IAsyncResult result = wrappedAction.BeginInvoke(null, null);
if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
{
reply = "Connected";
wrappedAction.EndInvoke(result);
return reply;
}
else
{
threadToKill.Abort();
reply = "Error";
return reply;
}
}
then I call it with something like :
string replyfromreader = CallWithTimeout(connectToHardware, 20000);
the connectToHardware is just a one liner so no need to post.
Avoiding
Thread.Abortis always a good idea. Avoiding it on a thread you did not create is even better.Assuming if the hardware is not working, and you want the timeout, it does not matter if
connectToHardwareis left to timeout on its own and no error/exception details are wanted, then you can use the Task Parallel Library (TPL):System.Threading.Tasks.Task:(If the passed
Actioncould interact with a passedCancellationTokenthis could be made cleaner, allowing the underlying method to fail quickly on timeout.)