Dispatcher.PushFrame: clean references before return
authorDmitry Potapov <dpotapov@gmail.com>
Sun, 2 Feb 2014 19:55:12 +0000 (23:55 +0400)
committerDmitry Potapov <dpotapov@gmail.com>
Sun, 2 Feb 2014 19:55:12 +0000 (23:55 +0400)
The dispatcher did not clean references before returning, therefore
the second call to Dispatcher.Run() failed.

mcs/class/WindowsBase/System.Windows.Threading/Dispatcher.cs
mcs/class/WindowsBase/Test/System.Windows.Threading/DispatcherTest.cs

index 031f8081e8783012feefc630e14ac3c86cfb1717..f9c11ccc8fe9cb3f5123b58857d551e97947004c 100644 (file)
@@ -358,6 +358,10 @@ namespace System.Windows.Threading {
                        frame.dispatcher = dis;
 
                        dis.RunFrame (frame);
+
+                       frame.dispatcher = null;
+                       dis.current_frame = frame.ParentFrame;
+                       frame.ParentFrame = null;
                }
 
                void PerformShutdown ()
index 614cef51a43c6a1390b6b468fdeed95edc7a847c..0980ebb12ba6a33c622cde100eeabd2797a6a39d 100644 (file)
@@ -149,6 +149,18 @@ namespace MonoTests.System.Windows.Threading
 
                        Dispatcher.PushFrame(frame);
                }
+
+               [Test]
+               public void TestRunTwice()
+               {
+                       Dispatcher d = Dispatcher.CurrentDispatcher;
+                       Action exit = delegate { Dispatcher.ExitAllFrames(); };
+
+                       d.BeginInvoke(DispatcherPriority.Normal, exit);
+                       Dispatcher.Run();
+                       d.BeginInvoke(DispatcherPriority.Normal, exit);
+                       Dispatcher.Run();
+               }
        }
 }