Question: I commonly employ a while loop that continues to try some operation until either the operation succeeds or a timeout has elapsed:

```
bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
     Thread.sleep( 1000 );
     elapsed += 1000;
     success = ... some operation ...     
}

```

I know there a couple of way to implement this, but the basic point is that I repeatedly try some operation with a sleep until success or I've slept too long in aggregate.

Is there a built-in .net class/method/etc to save me from re-writing this pattern all over the place? Perhaps input is an Func(of bool) and the timeout?

**Edit**  
Thanks to all who contributed. I opted for the sleep() approach because it was the least complicated and I'm totally anti-complexity =) Here's my (still needs to be tested) implimentation:

```
 public static bool RetryUntilSuccessOrTimeout( Func<bool> task , TimeSpan timeout , TimeSpan pause )
    {

        if ( pause.TotalMilliseconds < 0 )
        {
            throw new ArgumentException( "pause must be >= 0 milliseconds" );
        }
        var stopwatch = Stopwatch.StartNew();
        do
        {
            if ( task() ) { return true; }
            Thread.Sleep( ( int )pause.TotalMilliseconds );
        }
        while ( stopwatch.Elapsed < timeout );
        return false;
    }

```

Answer: 
You could use `SpinWait.SpinUntil`

See <https://msdn.microsoft.com/en-us/library/dd449238(v=vs.110).aspx>

```
bool spinUntil = System.Threading.SpinWait.SpinUntil(() => job.IsDisposed, TimeSpan.FromSeconds(5));

```
You really should not have to use `Sleep()` to wait for tasks to complete. You waste an average of 500ms after the task has completed by doing this.

You ought to be able to do this deterministically using Task Parallel Library, see [here](http://msdn.microsoft.com/en-us/library/dd537610.aspx) for example.

> 
> This example shows how to use the Wait
>  method, or its equivalent in the
>  Task class, to wait on a
>  single task. It also shows how to use
>  the static WaitAll and WaitAny methods
>  to wait on multiple tasks.
> 
> 
>