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); }
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); }
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); }
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(); } }
public void Post(Action action, ThreadPostPriority priority) => Execute(action, priority);