public void InvokeAsyncTests()
        {
            dispatcher = new Dispatcher(true);
            int executed = 0;

            Assert.AreEqual(0, dispatcher.Count);

            //Should invoke synchronously
            ActionDispatcherTask task = dispatcher.InvokeAsync(() => { executed++; return; });

            Assert.AreEqual(0, dispatcher.Count);
            Assert.AreEqual(1, executed);
            Assert.AreEqual(DispatcherTaskState.CompletedImmediate, task.TaskState);

            //Should invoke asynchronously
            Thread t = new Thread(() =>
            {
                task = dispatcher.InvokeAsync(() => { executed++; return; });
            });

            t.Start();
            t.Join();

            Assert.AreEqual(1, dispatcher.Count);
            Assert.AreEqual(1, executed);
            Assert.AreEqual(DispatcherTaskState.Queued, task.TaskState);

            dispatcher.ExecuteDispatcherTasks();

            Assert.AreEqual(0, dispatcher.Count);
            Assert.AreEqual(2, executed);
            Assert.AreEqual(DispatcherTaskState.CompletedQueued, task.TaskState);
        }
        public void TestExecuteAsynchronous()
        {
            bool set = false;
            ActionDispatcherTask task = ActionDispatcherTask.Create(() => set = true);

            Assert.AreEqual(DispatcherTaskState.Queued, task.TaskState);

            task.Execute(false);

            Assert.IsTrue(set);
            Assert.AreEqual(DispatcherTaskState.CompletedQueued, task.TaskState);
        }
        public void TestExecuteException()
        {
            Exception            exception = new Exception();
            ActionDispatcherTask task      = ActionDispatcherTask.Create(() => throw exception);

            Assert.AreEqual(DispatcherTaskState.Queued, task.TaskState);

            Assert.ThrowsException <DispatcherException>(() =>
            {
                task.Execute(true);
            });

            Assert.AreEqual(DispatcherTaskState.Failed, task.TaskState);
            Assert.AreEqual(exception, task.Exception);
        }
        public static void ReturnActionDispatcherTask(ActionDispatcherTask task)
        {
            if (!initialized)
            {
                ThreadInitialize();
            }

#if DEBUG
            ObjectCacheTestHelper.ActionDispatcherTaskWasReturned();
#endif

            if (!actionDispatcherTaskPool.ReturnInstance(task))
            {
                task.ActuallyDispose();
            }
        }