public bool TryComplete(T result) { var completed = false; if (Interlocked.Exchange(ref _isCompleted, 1) == 0) { TaskRunner.RunInBackground(() => _completion.SetResult(result)); completed = true; } else { completed = false; } Task.Wait(); return(completed); }
protected void RunWithTimeout(TimeSpan timeout, Func <Task> func) { using (var cancellation = new CancellationTokenSource(timeout)) { try { TaskRunner .RunInBackground(func, cancellation.Token) .WithCancellation(cancellation.Token) .GetResult(); } catch (OperationCanceledException) when(cancellation.IsCancellationRequested) { throw new TimeoutException($"Task not completed after {timeout.TotalMilliseconds} ms"); } } }
public bool TryCancel() { var completed = false; if (Interlocked.Exchange(ref _isCompleted, 1) == 0) { TaskRunner.RunInBackground(() => _completion.SetCanceled()); completed = true; } else { completed = false; } try { Task.Wait(); } catch { // ignored } return(completed); }
public bool TryFail(IEnumerable <Exception> errors) { var completed = false; if (Interlocked.Exchange(ref _isCompleted, 1) == 0) { TaskRunner.RunInBackground(() => _completion.SetException(errors)); completed = true; } else { completed = false; } try { Task.Wait(); } catch { // ignored } return(completed); }
public void Dispose() { _log.Trace("Disposing"); TaskRunner.RunInBackground(StopAsync).LogAndIgnoreExceptions(_log).GetResult(); }
protected void RunWithTimeout(TimeSpan timeout, Func <Task> func) => Should.CompleteIn(() => TaskRunner.RunInBackground(func), timeout);