@@ -21,6 +21,7 @@ public class GuiTestContext : IDisposable
21
21
private readonly StringBuilder _logsSb ;
22
22
private readonly V2TestDriver _driver ;
23
23
private bool _finished ;
24
+ private readonly object _threadLock = new ( ) ;
24
25
25
26
internal GuiTestContext ( Func < Toplevel > topLevelBuilder , int width , int height , V2TestDriver driver )
26
27
{
@@ -42,46 +43,49 @@ internal GuiTestContext (Func<Toplevel> topLevelBuilder, int width, int height,
42
43
43
44
var booting = new SemaphoreSlim ( 0 , 1 ) ;
44
45
45
- // Start the application in a background thread
46
- _runTask = Task . Run (
47
- ( ) =>
48
- {
49
- try
50
- {
51
- ApplicationImpl . ChangeInstance ( v2 ) ;
52
-
53
- ILogger logger = LoggerFactory . Create (
54
- builder =>
55
- builder . SetMinimumLevel ( LogLevel . Trace )
56
- . AddProvider ( new TextWriterLoggerProvider ( new StringWriter ( _logsSb ) ) ) )
57
- . CreateLogger ( "Test Logging" ) ;
58
- Logging . Logger = logger ;
59
-
60
- v2 . Init ( null , GetDriverName ( ) ) ;
61
-
62
- booting . Release ( ) ;
63
-
64
- Toplevel t = topLevelBuilder ( ) ;
65
- t . Closed += ( s , e ) => { _finished = true ; } ;
66
- Application . Run ( t ) ; // This will block, but it's on a background thread now
67
-
68
- t . Dispose ( ) ;
69
- Application . Shutdown ( ) ;
70
- }
71
- catch ( OperationCanceledException )
72
- { }
73
- catch ( Exception ex )
74
- {
75
- _ex = ex ;
76
- }
77
- finally
46
+ lock ( _threadLock )
47
+ {
48
+ // Start the application in a background thread
49
+ _runTask = Task . Run (
50
+ ( ) =>
78
51
{
79
- ApplicationImpl . ChangeInstance ( origApp ) ;
80
- Logging . Logger = origLogger ;
81
- _finished = true ;
82
- }
83
- } ,
84
- _cts . Token ) ;
52
+ try
53
+ {
54
+ ApplicationImpl . ChangeInstance ( v2 ) ;
55
+
56
+ ILogger logger = LoggerFactory . Create (
57
+ builder =>
58
+ builder . SetMinimumLevel ( LogLevel . Trace )
59
+ . AddProvider ( new TextWriterLoggerProvider ( new StringWriter ( _logsSb ) ) ) )
60
+ . CreateLogger ( "Test Logging" ) ;
61
+ Logging . Logger = logger ;
62
+
63
+ v2 . Init ( null , GetDriverName ( ) ) ;
64
+
65
+ booting . Release ( ) ;
66
+
67
+ Toplevel t = topLevelBuilder ( ) ;
68
+ t . Closed += ( s , e ) => { _finished = true ; } ;
69
+ Application . Run ( t ) ; // This will block, but it's on a background thread now
70
+
71
+ t . Dispose ( ) ;
72
+ Application . Shutdown ( ) ;
73
+ }
74
+ catch ( OperationCanceledException )
75
+ { }
76
+ catch ( Exception ex )
77
+ {
78
+ _ex = ex ;
79
+ }
80
+ finally
81
+ {
82
+ ApplicationImpl . ChangeInstance ( origApp ) ;
83
+ Logging . Logger = origLogger ;
84
+ _finished = true ;
85
+ }
86
+ } ,
87
+ _cts . Token ) ;
88
+ }
85
89
86
90
// Wait for booting to complete with a timeout to avoid hangs
87
91
if ( ! booting . WaitAsync ( TimeSpan . FromSeconds ( 5 ) ) . Result )
0 commit comments