Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing RegEx Timeout in .NET 4

Platform: Silverlight 4, .NET 4

With the .NET 4.5 Developer preview the RegEx class has been enhanced to allow setting of a Timeout value which would prevent the RegEx engine from hanging the UI if there are issues with the pattern matching.

Requesting suggestions to implement a similar functionality in a .NET 4 Silverlight application.

Thanks in advance.

like image 985
Vaibhav Avatar asked Feb 27 '12 06:02

Vaibhav


2 Answers

Generic example:

public static R WithTimeout<R>(Func<R> proc, int duration)
{
  var wh = proc.BeginInvoke(null, null);

  if (wh.AsyncWaitHandle.WaitOne(duration))
  {
    return proc.EndInvoke(wh);
  }

  throw new TimeOutException();
}

Usage:

var r = WithTimeout(() => regex.Match(foo), 1000);

Update:

As pointed out by Christian.K, the async thread will still continue running.

Here is one where the thread will terminate:

public static R WithTimeout<R>(Func<R> proc, int duration)
{
  var reset = new AutoResetEvent(false);
  var r = default(R);
  Exception ex = null;

  var t = new Thread(() =>
  {
    try
    {
      r = proc();
    }
    catch (Exception e)
    {
      ex = e;
    }
    reset.Set();
  });

  t.Start();

  // not sure if this is really needed in general
  while (t.ThreadState != ThreadState.Running)
  {
    Thread.Sleep(0);
  }

  if (!reset.WaitOne(duration))
  {
    t.Abort();
    throw new TimeoutException();
  }

  if (ex != null)
  {
    throw ex;
  }

  return r;
}

Update:

Fixed above snippet to deal with exceptions correctly.

like image 68
leppie Avatar answered Nov 12 '22 02:11

leppie


It is not that simple - but it can be done using two threads with the first doing the regex, the second killing the first thread if itruns too long. This is problematic in itself, though.

like image 3
TomTom Avatar answered Nov 12 '22 02:11

TomTom