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;
        }
Пример #2
0
        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);
        }