Skip to content

Commit 84ce71f

Browse files
Copilotbrianrob
andcommitted
Fix COMException 0x800700AA: share CoreWebView2Environment across WebBrowserWindow instances
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com> Agent-Logs-Url: https://github.com/microsoft/perfview/sessions/a11a3a97-f6a5-4e55-8aed-427f278d4bb9
1 parent da585e7 commit 84ce71f

1 file changed

Lines changed: 22 additions & 2 deletions

File tree

src/PerfView/GuiUtilities/WebBrowser/WebBrowser.xaml.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.ComponentModel;
33
using System.IO;
4+
using System.Threading.Tasks;
45
using System.Windows;
56
using System.Windows.Controls;
67
using 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

Comments
 (0)