示例#1
0
        /// <summary>
        /// Enqueues a method for exection inside the current ThreadPool and returns a <see cref="Task{TRes}"/> that represents queued operation
        /// </summary>
        /// <typeparam name="TState">Type of the user state object</typeparam>
        /// <typeparam name="TRes">The type of the operation result</typeparam>
        /// <param name="func">Representing the method to execute</param>
        /// <param name="state">State object</param>
        /// <returns>Created Task</returns>
        /// <exception cref="ArgumentNullException">Func is null</exception>
        public virtual Task <TRes> RunAsTask <TState, TRes>(Func <TState, TRes> func, TState state)
        {
            if (func == null)
            {
                throw new ArgumentNullException(nameof(func));
            }

            var item = new TaskFuncThreadPoolWorkItem <TState, TRes>(func, state);

            AddWorkItem(item);
            return(item.Task);
        }
        public void TestTaskFuncThreadPoolWorkItemExecute()
        {
            int wasExecuted = 0;

            var item = new TaskFuncThreadPoolWorkItem <int>(() =>
            {
                Interlocked.Exchange(ref wasExecuted, 1);
                return(2);
            });

            item.Run(false, true);

            Assert.AreEqual(1, wasExecuted);
            Assert.IsTrue(item.Task.IsCompleted);
            Assert.AreEqual(2, item.Task.Result);
        }
        public void TestTaskFuncThreadPoolWorkItemWithParamExecute()
        {
            int wasExecuted = 0;
            int stateVal    = 0;

            var item = new TaskFuncThreadPoolWorkItem <int, int>((state) =>
            {
                stateVal = state;
                Interlocked.Exchange(ref wasExecuted, 1);
                return(2);
            }, 100);

            item.Run(false, true);

            Assert.AreEqual(1, wasExecuted);
            Assert.AreEqual(100, stateVal);
            Assert.IsTrue(item.Task.IsCompleted);
            Assert.AreEqual(2, item.Task.Result);
        }