我的 C# 应用程序使用 WebView2。
要求多个实例同时打开,且不共享会话。根据这个WebView2流程模型解释 https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/process-model,这是通过使用不同的用户数据文件夹 https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/user-data-folders,在创建 CoreWebView2Environment 时传递。
该应用程序当前是从只读网络共享加载的,因此与 exe 一起创建用户数据文件夹的默认设置不符合条件,因此我的实现在用户临时目录中创建了不同的 UserDataFolders。
为了清理,我想在应用程序关闭时删除创建的目录。
该文档建议浏览器进程退出 https://learn.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2environment.browserprocessexited?view=webview2-dotnet-1.0.1072.54当 WebView2 占用的所有资源都被释放时应该调用的事件。
But the BrowserProcessExited 事件永远不会被调用.
在使用 WebView2 的页面中,我这样做:
public void MyApp_Closing(object sender, CancelEventArgs e)
{
glucoTabWebcontrol2.CoreWebView2.Environment.BrowserProcessExited += Environment_BrowserProcessExited;
}
// This is never called
private void Environment_BrowserProcessExited(object sender, CoreWebView2BrowserProcessExitedEventArgs e)
{
try
{
System.IO.Directory.Delete(((CoreWebView2Environment)sender).UserDataFolder);
} catch (Exception ex)
{
... handle exception
}
}
我的猜测是应用程序在事件触发之前关闭。
要实现这一目标需要什么BrowserProcessExited
事件已收到?
您必须等待进程退出才能关闭应用程序。来自docs https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/user-data-folder?tabs=win32:
要删除用户数据文件夹 (UDF),您必须首先结束 WebView2 会话。如果 WebView2 会话当前处于活动状态,则无法删除 UDF。
如果 WebView2 主机应用程序关闭后文件仍在使用中,请等待浏览器进程退出,然后再删除用户数据文件夹 (UDF)。
WebView2 应用程序关闭后,UDF 中的文件可能仍在使用中。在这种情况下,请等待浏览器进程和所有子进程退出后再删除UDF。要监视进程以等待它们退出,请使用 WebView2 应用实例的 BrowserProcessId 属性检索浏览器进程的进程 ID。
我是这样做的,与 CFou 的答案类似:
Application.Current.Exit += OnAppExit;
private void OnAppExit(object sender, ExitEventArgs e)
{
try
{
// Delete WebView2 user data before application exits
string? webViewCacheDir = Browser.CoreWebView2.Environment.UserDataFolder;
var webViewProcessId = Convert.ToInt32(Browser.CoreWebView2.BrowserProcessId);
var webViewProcess = Process.GetProcessById(webViewProcessId);
// Shutdown browser with Dispose, and wait for process to exit
Browser.Dispose();
webViewProcess.WaitForExit(3000);
Directory.Delete(webViewCacheDir, true);
}
catch (Exception ex)
{
// log warning
}
}
我将超时设置为 3 秒,这应该足够了。请注意不要使用 WaitForExit 的异步版本,因为无法等待 async void 方法,因此 WPF 会很高兴地继续关闭应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)