Exemple #1
0
        public Task <T> SendAsync <T>(Func <Task <T> > action, ThreadPostPriority priority)
        {
            var tcs = new TaskCompletionSource <T>();

            Execute(async() => {
                tcs.TrySetResult(await action());
            }, priority);

            return(tcs.Task);
        }
Exemple #2
0
        public Task <T> SendAsync <T>(Func <T> action, ThreadPostPriority priority)
        {
            var tcs = new TaskCompletionSource <T>();

            Execute(() => {
                try {
                    tcs.TrySetResult(action());
                } catch (OperationCanceledException) {
                    tcs.TrySetCanceled();
                } catch (Exception ex) {
                    tcs.TrySetException(ex);
                }
            }, priority);

            return(tcs.Task);
        }
        public Task <T> SendAsync <T>(Func <T> action, ThreadPostPriority priority, IHostUIService ui, CancellationToken ct = default)
        {
            var tcs = new TaskCompletionSource <T>();

            Execute(() => {
                try {
                    tcs.TrySetResult(action());
                } catch (OperationCanceledException) {
                    tcs.TrySetCanceled();
                } catch (Exception ex) {
                    ui.LogMessageAsync($"Exception {ex.Message} at {ex.StackTrace}", MessageType.Error).DoNotWait();
                    tcs.TrySetException(ex);
                }
            }, priority);

            return(tcs.Task);
        }
Exemple #4
0
        public Task <T> SendAsync <T>(Func <Task <T> > action, ThreadPostPriority priority)
        {
            var tcs = new TaskCompletionSource <T>();

#pragma warning disable VSTHRD101 // Avoid unsupported async delegates
            Execute(async() => {
                try {
                    tcs.TrySetResult(await action());
                } catch (OperationCanceledException) {
                    tcs.TrySetCanceled();
                } catch (Exception ex) {
                    tcs.TrySetException(ex);
                }
            }, priority);
#pragma warning restore VSTHRD101 // Avoid unsupported async delegates

            return(tcs.Task);
        }
        public Task <T> SendAsync <T>(Func <Task <T> > action, ThreadPostPriority priority, IHostUIService ui, CancellationToken ct = default)
        {
            var tcs = new TaskCompletionSource <T>();

#pragma warning disable VSTHRD101 // Avoid unsupported async delegates
            Execute(async() => {
                try {
                    tcs.TrySetResult(await action());
                } catch (OperationCanceledException) {
                    tcs.TrySetCanceled();
                } catch (Exception ex) {
                    ui.LogMessageAsync($"Exception {ex.Message} at {ex.StackTrace}", MessageType.Error).DoNotWait();
                    tcs.TrySetException(ex);
                }
            }, priority);
#pragma warning restore VSTHRD101 // Avoid unsupported async delegates

            return(tcs.Task);
        }
Exemple #6
0
        private void Execute(Action action, ThreadPostPriority priority)
        {
            _disposableBag.ThrowIfDisposed();

            BufferBlock <Action> queue = null;

            if (priority == ThreadPostPriority.IdleOnce)
            {
                _idleOnceAction = action;
            }
            else
            {
                if (ThreadId == Thread.CurrentThread.ManagedThreadId)
                {
                    action();
                }
                else
                {
                    switch (priority)
                    {
                    case ThreadPostPriority.Idle:
                        queue = _idleTimeQueue;
                        break;

                    case ThreadPostPriority.Background:
                        queue = _backgroundPriorityQueue;
                        break;

                    case ThreadPostPriority.Normal:
                        queue = _normalPriorityQueue;
                        break;
                    }
                }
            }

            lock (_lock) {
                queue?.Post(action);
                _workItemsAvailable.Set();
            }
        }
Exemple #7
0
 public void Post(Action action, ThreadPostPriority priority)
 => Execute(action, priority);