public async Task IntervalTest() { var tcs = new TaskCompletionSource<bool>(); var resetEvent = new AsyncAutoResetEvent(); //Timeout in 100ms Task timeoutTask = resetEvent.WaitAsync(TimeSpan.FromMilliseconds(100)).ContinueWith((r) => tcs.TrySetResult(true)); Task testTimeoutTask = Task.Delay(1000).ContinueWith((r) => tcs.TrySetResult(false)); bool success = await tcs.Task; Assert.IsTrue(success, "Timeout for async reset event failed to fire"); }
public async Task<bool> StartupAsync(Func<object, Task> workerMethod, object workerState, Func<bool> checkForContinueMethod = null) { await ShutdownAsync(); if (workerMethod == null) throw new ArgumentException("WorkerMethod cannot be null", "workerMethod"); IsRunning = true; this.workerMethod = workerMethod; this.workerState = workerState; this.checkForContinueMethod = checkForContinueMethod; asyncResetEvent = new AsyncAutoResetEvent(); await Task.Factory.StartNew(() => AsyncWorker(), TaskCreationOptions.LongRunning); return true; }
public async Task <bool> StartupAsync(Func <object, Task> workerMethod, object workerState, Func <bool> checkForContinueMethod = null) { await ShutdownAsync(); if (workerMethod == null) { throw new ArgumentException("WorkerMethod cannot be null", "workerMethod"); } IsRunning = true; this.workerMethod = workerMethod; this.workerState = workerState; this.checkForContinueMethod = checkForContinueMethod; asyncResetEvent = new AsyncAutoResetEvent(); await Task.Factory.StartNew(() => AsyncWorker(), TaskCreationOptions.LongRunning); return(true); }
/// <summary> /// Shuts down the auto reset worker. /// </summary> /// <param name="maxWait">Amount of time, in milliseconds, to wait for a current running task to complete.</param> /// <returns>True if shutdown was successful, or false if maxWait elapsed. A return of false indicates the worker task has not yet completed.</returns> public async Task<bool> ShutdownAsync(int maxWait = Timeout.Infinite) { IsRunning = false; bool timedOut = false; if (isWorkerRunning) { if (asyncResetEvent != null) { asyncResetEvent.Set(); } DateTime starttime = DateTime.Now; while (isWorkerRunning) { await Task.Delay(10); if (maxWait != Timeout.Infinite && starttime.AddMilliseconds(maxWait) < DateTime.Now) { timedOut = true; break; } } } workerMethod = null; checkForContinueMethod = null; asyncResetEvent = null; return !timedOut; }