private static TryOperationResult <object> ExecuteCallback(CancellationToken token,
                                                            DispatchedWork callback,
                                                            IThreadWorkSource s,
                                                            CancellationToken token2)
 {
     return(callback(s, CancellationTokenSource.CreateLinkedTokenSource(token2, token).Token));
 }
        /// <summary>
        ///     Blocks there current thread until results are available
        /// </summary>
        /// <param name="token"></param>
        /// <param name="callback"></param>
        /// <returns></returns>
        public TryOperationResult <object> SendWork(
            CancellationToken token,
            DispatchedWork callback)
        {
            var result = PostWork(token, callback);

            result.WaitForChange(-1);
            return(result);
        }
        public bool TryGetWork(out DispatchedWork work)
        {
            foreach (var source in Sources)
            {
                if (source.TryGetWork(out work))
                {
                    return(true);
                }
            }

            work = null;
            return(false);
        }
        /// <summary>
        ///     Post work for to be executed on another thread without regard to when it returns
        /// </summary>
        /// <param name="token"></param>
        /// <param name="callback"></param>
        /// <returns>An operation result that can be waited on</returns>
        public TryOperationResult <object> PostWork(CancellationToken token, DispatchedWork callback)
        {
            var result = new TryOperationResult <object>();

            _workers.Enqueue((source, token2) => {
                try {
                    result.SetSuccess(ExecuteCallback(token, callback, source, token2).Result);
                }
                catch (Exception ex) {
                    result.SetFailure(ex);
                }
                return(result);
            });
            return(result);
        }
        public TryOperationResult <object> SendWork(CancellationToken token, DispatchedWork callback)
        {
            var source = GetViableSource();

            return(source.SendWork(token, callback));
        }
 public bool TryGetWork(out DispatchedWork work)
 {
     return(_workers.TryDequeue(out work));
 }