/// <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); }