MicrosoftEdge / MicrosoftEdge/WebView2Feedback

[Problem/Bug]: WebView2CompositionControl causes UCEERR_RENDERTHREADFAILURE and process freeze/crash on monitor disconnect (.NET Framework 4.8)

Ouverte
#5,653 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug
Langage dominant
PowerShell
Étoiles
526
Forks
67
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

What happened?

When a monitor is disconnected while WebView2CompositionControl is active, the WPF render thread fails with UCEERR_RENDERTHREADFAILURE (0x88980406). In apps without a global exception handler the process crashes immediately. In apps with a DispatcherUnhandledException handler the exception is swallowed but the control is left permanently frozen — rendering stops and never recovers. The only workaround is to fully dispose and recreate the control.

This does not reproduce on .NET 8. It reproduces consistently on .NET Framework 4.8.


Environment

  • WebView2 SDK: Microsoft.Web.WebView2 1.0.4078.44
  • Framework: .NET Framework 4.8
  • OS: Windows 11 26100
  • Reproduced on: multiple machines with multi-monitor setups
Importance

Blocking. My app's basic functions are not working due to this issue.

Runtime Channel

Stable release (WebView2 Runtime)

Runtime Version

1.0.4078.44

SDK Version

1.0.4078.44

Framework

WPF

Operating System

Windows 11

OS Version

26100

Repro steps

Steps to reproduce

  1. Create a WPF .NET Framework 4.8 app with a WebView2CompositionControl
  2. Call EnsureCoreWebView2Async() and navigate to any URL
  3. With a multi-monitor setup, disconnect the monitor the app window is on

Minimal repro (see attached project):

<!-- MainWindow.xaml -->
<wv2:WebView2CompositionControl x:Name="webView"/>
// MainWindow.xaml.cs
private async void OnLoaded(object sender, RoutedEventArgs e)
{
    await webView.EnsureCoreWebView2Async();
    webView.CoreWebView2.Navigate("https://www.example.com");
}
<!-- WebView2CompositionReproNet48.csproj -->
<TargetFramework>net48</TargetFramework>
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.4078.44" />

Expected behavior

The control recovers gracefully from the device loss caused by the topology change — similar to how DeviceRemoved is intended to work.


Actual behavior

On disconnect, the process hits UCEERR_RENDERTHREADFAILURE originating from inside WebView2's D3D composition:

System.Runtime.InteropServices.COMException (0x88980406): UCEERR_RENDERTHREADFAILURE
   at System.Windows.Media.Composition.DUCE.Channel.SyncFlush()
   at System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean, Nullable`1)
   at System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr)
   at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage, IntPtr, IntPtr)
   at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr, Int32, IntPtr, IntPtr, Boolean&)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean&)
  • Without a global exception handler: the app freezes, then crashes as the unhandled exception propagates
  • With DispatcherUnhandledException / e.Handled = true: the process survives but WebView2CompositionControl is permanently frozen — rendering never recovers

The exception fires multiple times from the same disconnect event (burst), and DeviceRemoved does not fire reliably to allow for self-recovery.

We also observe a secondary NullReferenceException inside GraphicsItemD3DImage.IsFrontBufferAvailablePropertyChangedRequestRender() after the topology change, when WPF fires IsFrontBufferAvailable = true before the D3D device has recovered and the SDK's _session/_framePool fields are already null.


What does NOT reproduce on .NET 8

The same minimal app targeting net8.0-windows10.0.17763.0 with the same WebView2 SDK version does not freeze or crash on monitor disconnect.


Workaround

We hook WM_DISPLAYCHANGE on the main window HWND and fully dispose and recreate WebView2CompositionControl when the active monitor changes. This prevents the freeze but requires tearing down the entire control. We also patch the PropertyMetadata callback for IsFrontBufferAvailableProperty on GraphicsItemD3DImage via reflection to catch the NullReferenceException.

Neither workaround should be necessary — the SDK should handle display topology changes internally.


WebView2CompositionReproNet48.zip

Repros in Edge Browser

No, issue does not reproduce in the corresponding Edge version

Regression

No, this never worked

Last working version (if regression)

No response

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le projet WebView2CompositionReproNet48 joint, en particulier MainWindow.xaml, MainWindow.xaml.cs et WebView2CompositionReproNet48.csproj. Exécutez l’application net48 avec WebView2 SDK 1.0.4078.44, accédez à une page et déconnectez le moniteur actif afin de confirmer l’échec du thread de rendu et le contrôle figé. Le travail est terminé lorsqu’un mécanisme de récupération au niveau du SDK, qui évite d’avoir à effectuer une libération et une recréation après la modification de la topologie des écrans, a été identifié.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp
Domaine
desktop
Type d'issue
Bug
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
Calme
Clarté
Clairement spécifiée
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.