public Task<IExecutionResult> ExecuteAsync(IPriorityWork work) { var logger = LogManager.GetCurrentClassLogger(); logger.Debug($"Pushed work onto queue: {work.Description}"); var completionSource = new TaskCompletionSource<IExecutionResult>(); _active.WriteLock(active => active.Add(completionSource.Task)); Action executor = () => { try { _active.WriteLock(active => active.Remove(completionSource.Task)); var task = work.ExecuteAsync(); if (task.Wait(TimeSpan.FromSeconds(10d)) == false) { logger.Error($"Work execution timed out: {work.Description}"); completionSource.SetException( new TestException( $"Timed out waiting for script execution to complete: {work.Description}")); } else { completionSource.SetResult(task.Result); } } catch (Exception ex) { logger.Error(ex, $"Error while executing work: {work.Description}: {ex.Message}"); completionSource.SetException( new TestException( $"Uncaught exception while executing job: {work.Description}: {ex.Message}", ex)); } }; Task.Run(executor); return completionSource.Task; }
public Task <IExecutionResult> ExecuteAsync(IPriorityWork work) { var logger = LogManager.GetCurrentClassLogger(); logger.Debug($"Pushed work onto queue: {work.Description}"); var completionSource = new TaskCompletionSource <IExecutionResult>(); _active.WriteLock(active => active.Add(completionSource.Task)); Action executor = () => { try { _active.WriteLock(active => active.Remove(completionSource.Task)); var task = work.ExecuteAsync(); if (task.Wait(TimeSpan.FromSeconds(10d)) == false) { logger.Error($"Work execution timed out: {work.Description}"); completionSource.SetException( new TestException( $"Timed out waiting for script execution to complete: {work.Description}")); } else { completionSource.SetResult(task.Result); } } catch (Exception ex) { logger.Error(ex, $"Error while executing work: {work.Description}: {ex.Message}"); completionSource.SetException( new TestException( $"Uncaught exception while executing job: {work.Description}: {ex.Message}", ex)); } }; Task.Run(executor); return(completionSource.Task); }