@@ -53,6 +53,124 @@ public void Dispose_Resets_SyncContext ()
5353 Assert . Null ( SynchronizationContext . Current ) ;
5454 }
5555
56+ [ Fact ]
57+ public void Init_Posts_To_The_App_Main_Thread ( )
58+ {
59+ IApplication app = Application . Create ( ) ;
60+ app . Init ( DriverRegistry . Names . ANSI ) ;
61+
62+ int mainThreadId = app . MainThreadId ?? Thread . CurrentThread . ManagedThreadId ;
63+ int ? callbackThreadId = null ;
64+ ManualResetEventSlim callbackCalled = new ( false ) ;
65+
66+ SynchronizationContext . Current ! . Post ( _ =>
67+ {
68+ callbackThreadId = Thread . CurrentThread . ManagedThreadId ;
69+ callbackCalled . Set ( ) ;
70+ } ,
71+ null ) ;
72+
73+ app . AddTimeout ( TimeSpan . FromMilliseconds ( 100 ) ,
74+ ( ) =>
75+ {
76+ app . RequestStop ( ) ;
77+
78+ return false ;
79+ } ) ;
80+
81+ app . Run ( new Window ( ) ) ;
82+
83+ Assert . True ( callbackCalled . Wait ( TimeSpan . FromMilliseconds ( 200 ) , TestContext . Current . CancellationToken ) ) ;
84+ Assert . Equal ( mainThreadId , callbackThreadId ) ;
85+
86+ app . Dispose ( ) ;
87+ }
88+
89+ [ Fact ]
90+ public void Init_Posts_To_The_App_Instance_Main_Thread ( )
91+ {
92+ IApplication app1 = Application . Create ( ) ;
93+ app1 . Init ( DriverRegistry . Names . ANSI ) ;
94+
95+ IApplication app2 = Application . Create ( ) ;
96+ app2 . Init ( DriverRegistry . Names . ANSI ) ;
97+
98+ int mainThreadId1 = app1 . MainThreadId ?? Thread . CurrentThread . ManagedThreadId ;
99+ int ? callbackThreadId1 = null ;
100+ SynchronizationContext ? synchronizationContext1 = null ;
101+
102+ ManualResetEventSlim callbackCalled = new ( false ) ;
103+
104+ app1 . AddTimeout ( TimeSpan . FromMilliseconds ( 100 ) ,
105+ ( ) =>
106+ {
107+ if ( synchronizationContext1 is null )
108+ {
109+ synchronizationContext1 = SynchronizationContext . Current ;
110+ synchronizationContext1 ? . Post ( _ =>
111+ {
112+ callbackThreadId1 = Thread . CurrentThread . ManagedThreadId ;
113+ callbackCalled . Set ( ) ;
114+ } ,
115+ null ) ;
116+
117+ return true ;
118+ }
119+ else
120+ {
121+ app1 . RequestStop ( ) ;
122+
123+ return false ;
124+ }
125+ } ) ;
126+
127+ app1 . Run ( new Window ( ) ) ;
128+
129+ Assert . True ( callbackCalled . Wait ( TimeSpan . FromMilliseconds ( 200 ) , TestContext . Current . CancellationToken ) ) ;
130+ Assert . Equal ( mainThreadId1 , callbackThreadId1 ) ;
131+ Assert . Equal ( synchronizationContext1 , SynchronizationContext . Current ) ;
132+
133+ callbackCalled . Reset ( ) ;
134+
135+ int mainThreadId2 = app2 . MainThreadId ?? Thread . CurrentThread . ManagedThreadId ;
136+ int ? callbackThreadId2 = null ;
137+ SynchronizationContext ? synchronizationContext2 = null ;
138+
139+ app2 . AddTimeout ( TimeSpan . FromMilliseconds ( 100 ) ,
140+ ( ) =>
141+ {
142+ if ( synchronizationContext2 is null )
143+ {
144+ synchronizationContext2 = SynchronizationContext . Current ;
145+ synchronizationContext2 ? . Post ( _ =>
146+ {
147+ callbackThreadId2 = Thread . CurrentThread . ManagedThreadId ;
148+ callbackCalled . Set ( ) ;
149+ } ,
150+ null ) ;
151+
152+ return true ;
153+ }
154+ else
155+ {
156+ app2 . RequestStop ( ) ;
157+
158+ return false ;
159+ }
160+ } ) ;
161+
162+ app2 . Run ( new Window ( ) ) ;
163+
164+ Assert . True ( callbackCalled . Wait ( TimeSpan . FromMilliseconds ( 200 ) , TestContext . Current . CancellationToken ) ) ;
165+ Assert . Equal ( mainThreadId2 , callbackThreadId2 ) ;
166+ Assert . NotEqual ( synchronizationContext1 , SynchronizationContext . Current ) ;
167+ Assert . Equal ( synchronizationContext2 , SynchronizationContext . Current ) ;
168+ Assert . NotEqual ( synchronizationContext1 , synchronizationContext2 ) ;
169+
170+ app1 . Dispose ( ) ;
171+ app2 . Dispose ( ) ;
172+ }
173+
56174 [ Fact ]
57175 public void Dispose_Alone_Does_Nothing ( )
58176 {
0 commit comments