11using System ;
22using System . ComponentModel ;
33using System . IO ;
4+ using System . Threading . Tasks ;
45using System . Windows ;
56using System . Windows . Controls ;
67using Microsoft . Web . WebView2 . Core ;
@@ -97,6 +98,15 @@ private void Window_Closing(object sender, CancelEventArgs e)
9798 }
9899 }
99100
101+ /// <summary>
102+ /// Shared WebView2 environment task. Reusing a single environment for all WebBrowserWindow
103+ /// instances prevents the COMException (0x800700AA) "The requested resource is in use" that
104+ /// occurs when multiple windows concurrently try to create separate environments backed by the
105+ /// same user-data folder.
106+ /// </summary>
107+ private static Task < CoreWebView2Environment > s_environmentTask ;
108+ private static readonly object s_environmentLock = new object ( ) ;
109+
100110 /// <summary>
101111 /// Ensure that we configure the WebView2 environment to specify where the user data is stored.
102112 /// </summary>
@@ -110,8 +120,18 @@ private void Browser_Loaded(object sender, RoutedEventArgs e)
110120 var userDataFolder = Path . Combine ( SupportFiles . SupportFileDir , "WebView2" ) ;
111121 Directory . CreateDirectory ( userDataFolder ) ;
112122
113- var environmentAwaiter = CoreWebView2Environment
114- . CreateAsync ( userDataFolder : userDataFolder )
123+ // All WebBrowserWindow instances share one environment task so that
124+ // CoreWebView2Environment.CreateAsync is only called once. Concurrent calls with
125+ // the same user-data folder can throw COMException 0x800700AA.
126+ lock ( s_environmentLock )
127+ {
128+ if ( s_environmentTask == null )
129+ {
130+ s_environmentTask = CoreWebView2Environment . CreateAsync ( userDataFolder : userDataFolder ) ;
131+ }
132+ }
133+
134+ var environmentAwaiter = s_environmentTask
115135 . ConfigureAwait ( true )
116136 . GetAwaiter ( ) ;
117137
0 commit comments