public void TestDebugInfoState( [Values(true, false)] bool debug, [Values(true, false)] bool secondAsync) { OcConfiguration.SaveOcDispatcherInvocationInstantiationStackTrace = debug; object context = new object(); object state = new object(); OcDispatcher dispatcher = new OcDispatcher(2); Action <object> action = null; Invocation parentInvocation; action = s => { Assert.AreEqual(s, state); Assert.IsTrue(dispatcher.CheckAccess()); Assert.AreEqual(OcDispatcher.Current, dispatcher); parentInvocation = dispatcher.CurrentInvocation; Assert.AreEqual(parentInvocation.Parent, null); Assert.AreEqual(parentInvocation.State, state); Assert.AreEqual(parentInvocation.Action, null); Assert.AreEqual(parentInvocation.ActionWithState, action); if (debug) { Assert.IsTrue(parentInvocation.InstantiationStackTrace != null); } Assert.AreEqual(parentInvocation.Context, context); Assert.AreEqual(parentInvocation.OcDispatcher, dispatcher); Assert.AreEqual(parentInvocation.Priority, 1); object state1 = new object(); Func <object, int> func1 = null; func1 = s1 => { Assert.IsTrue(dispatcher.CheckAccess()); Assert.AreEqual(OcDispatcher.Current, dispatcher); Invocation invocation1 = dispatcher.CurrentInvocation; Assert.AreEqual(invocation1.Parent, parentInvocation); Assert.AreEqual(invocation1.State, state1); Assert.AreEqual(invocation1.Action, null); if (debug) { Assert.IsTrue(invocation1.InstantiationStackTrace != null); } Assert.AreEqual(invocation1.Context, null); Assert.AreEqual(invocation1.OcDispatcher, dispatcher); Assert.AreEqual(invocation1.Priority, 0); return(3); }; if (secondAsync) { dispatcher.InvokeAsync(func1, state1).PropertyChanged += (sender, args) => { if (args.PropertyName == "Value") { Assert.AreEqual(((InvocationResult <int>)sender).Value, 3); } }; } else { Assert.AreEqual(dispatcher.Invoke(func1, state1).Value, 3); } }; Assert.IsFalse(dispatcher.CheckAccess()); dispatcher.Invoke(action, state, 1, context); dispatcher.Pass(); dispatcher.Pass(); Assert.AreEqual(dispatcher, StaticInfo.OcDispatchers[dispatcher.ManagedThreadId]); Assert.IsTrue(dispatcher.CurrentInvocation == null); Assert.IsTrue(OcDispatcher.Current == null); dispatcher.Dispose(); }