public void TestInvocationBehaviourIgnore()
        {
            OcDispatcher dispatcher = new OcDispatcher();

            dispatcher.NewInvocationBehaviour = NewInvocationBehaviour.Cancel;
            bool called = false;

            dispatcher.Invoke(() => { called = true; });
            dispatcher.Invoke(s => { called = true; }, new object());
            dispatcher.InvokeAsync(() => { called = true; });
            dispatcher.InvokeAsync(s => { called = true; }, new object());

            dispatcher.Invoke(() => { called = true; return(0); });
            dispatcher.Invoke(s => { called = true; return(0); }, new object());
            dispatcher.InvokeAsync(() => { called = true; return(0); });
            dispatcher.InvokeAsync(s => { called = true; return(0); }, new object());

            dispatcher.InvokeAsyncAwaitable(() => { called = true; });
            dispatcher.InvokeAsyncAwaitable(s => { called = true; }, new object());
            dispatcher.InvokeAsyncAwaitable(() => { called = true; return(0); });
            dispatcher.InvokeAsyncAwaitable(s => { called = true; return(0); }, new object());


            dispatcher.NewInvocationBehaviour = NewInvocationBehaviour.Accept;
            dispatcher.Pass();

            Assert.IsFalse(called);
            dispatcher.Dispose();
        }
        public void TestInvokeAsyncAwaitableFuncStateDispatcherThread()
        {
            OcDispatcher         dispatcher = new OcDispatcher(2);
            int                  count      = 0;
            ManualResetEventSlim mres       = new ManualResetEventSlim(false);
            object               context    = new object();

            dispatcher.Invoke(() =>
            {
                Invocation invocation = dispatcher.CurrentInvocation;

                dispatcher.InvokeAsync(async() =>
                {
                    count++;
                    Assert.AreEqual(dispatcher.CurrentInvocation.Parent, invocation);
                    Assert.IsTrue(dispatcher.CurrentInvocation.SetSynchronizationContext);

                    int returnCount = await dispatcher.InvokeAsyncAwaitable(state =>
                    {
                        Assert.AreEqual(count, 1);
                        count++;
                        Assert.AreEqual(dispatcher.CurrentInvocation.Priority, 0);
                        Assert.AreEqual(dispatcher.CurrentInvocation.Context, null);
                        return(count);
                    }, new object());

                    Assert.AreEqual(dispatcher.CurrentInvocation.Parent, invocation);
                    Assert.AreEqual(returnCount, 2);
                    Assert.AreEqual(count, 2);
                    count++;
                    Assert.AreEqual(Thread.CurrentThread.ManagedThreadId, dispatcher.ManagedThreadId);
                    Assert.AreEqual(dispatcher.CurrentInvocation.Priority, 1);
                    Assert.AreEqual(dispatcher.CurrentInvocation.Context, context);
                    mres.Set();
                }, 1, context, true);
            });


            mres.Wait();
            mres.Dispose();
            Assert.AreEqual(count, 3);
            dispatcher.Dispose();
        }
        public void TestInvokeAsyncAwaitableFuncStateNonDispatcherThread()
        {
            TestSynchronizationConext testSynchronizationConext = new TestSynchronizationConext();

            SynchronizationContext.SetSynchronizationContext(testSynchronizationConext);

            OcDispatcher         dispatcher = new OcDispatcher(2);
            int                  count      = 0;
            ManualResetEventSlim mres       = new ManualResetEventSlim(false);
            object               context    = new object();

            async void test()
            {
                count++;

                int count1 = await dispatcher.InvokeAsyncAwaitable(state =>
                {
                    Assert.AreEqual(count, 1);
                    count++;
                    Assert.AreEqual(dispatcher.CurrentInvocation.Priority, 1);
                    Assert.AreEqual(dispatcher.CurrentInvocation.Context, context);
                    return(count);
                }, new object(), 1, context);

                Assert.AreEqual(count1, 2);
                Assert.AreEqual(count, 2);
                count++;
                Assert.AreNotEqual(Thread.CurrentThread.ManagedThreadId, dispatcher.ManagedThreadId);
                Assert.AreEqual(dispatcher.CurrentInvocation, null);
                mres.Set();
            }

            test();
            mres.Wait();
            mres.Dispose();
            Assert.AreEqual(count, 3);
            dispatcher.Dispose();
        }