dotnet / dotnet/wpf

WPF shows that some windows in multithreading will be locked in the PenThreadWorker constructor

Open
#928 1 comment 2 reactions 0 assignees View on GitHub
Bug
Dominant language
C#
Stars
7.7k
Forks
1.3k
Avg merge
1d 11h
Merged PRs (30d)
61

Description

* .NET Core Version: 3.0.100-preview5-011568
* Windows version: 1903 18362.145
* Does the bug reproduce also in WPF for .NET Framework 4.8?: Maybe



**Problem description:**

WPF will initialize pen thread when the window initializing. But I find the window may be locked in PenThreadWorker constructor.

The `UnsafeNativeMethods.CreateResetEvent` will lock the thread.

**Actual behavior:**

I use multithreading to create some windows by this code and maybe the thread be locked in PenThreadWorker constructor.

The Demo code

```csharp
public partial class App : Application
{
///
protected override void OnStartup(StartupEventArgs e)
{
var thread = new Thread(() =>
{
var mainWindow = new MainWindow();
mainWindow.Show();
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

base.OnStartup(e);
}
}
```

The step

1. Run the code

1. Use the VisualStudio to suspend the application

Maybe you can find the application only create a `Stylus Input` thread and show only a main window and the other main window and the thread be locked in PenThreadWorker constructor and the window can not show

Why I need multithreading to show the windows? I need the splash window to show the welcome page and then I should show the main window in other thread to do the bussiness code and I should close the splash window when the main window showed.

But I found some users could not show the main window and the main window be lock in PenThreadWorker constructor.

I use dnspy to suspend the application and find the code run in PenThreadWorker constructor and the `UnsafeNativeMethods.CreateResetEvent` will lock the thread.

```csharp
PenThreadWorker..ctor()
PenThread..ctor()
PenThreadPool.GetPenThreadForPenContextHelper(PenContext penContext)
PenThreadPool.GetPenThreadForPenContext(PenContext penContext)
WispTabletDeviceCollection.UpdateTabletsImpl()
WispTabletDeviceCollection.UpdateTablets()
WispTabletDeviceCollection..ctor()
WispLogic.get_WispTabletDevices()
WispLogic.RegisterHwndForInput(InputManager inputManager, PresentationSource inputSource)
HwndStylusInputProvider..ctor(HwndSource source)
HwndSource.Initialize(HwndSourceParameters parameters)
HwndSource..ctor(HwndSourceParameters parameters)

PresentationFramework.dll!System.Windows.Window.CreateSourceWindow(bool duringShow)
PresentationFramework.dll!System.Windows.Window.CreateSourceWindowDuringShow()
PresentationFramework.dll!System.Windows.Window.ShowHelper(object booleanBox)
```

**Expected behavior:**

The `UnsafeNativeMethods.CreateResetEvent` do not lock the thread

**Minimal repro:**

Create a empty WPF application and then change the app.xaml.cs code

```csharp
public partial class App : Application
{
///
protected override void OnStartup(StartupEventArgs e)
{
var thread = new Thread(() =>
{
var mainWindow = new MainWindow();
mainWindow.Show();
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

base.OnStartup(e);
}
}
```

Run the code and maybe you can find one of the main window can not show and it stop in `UnsafeNativeMethods.CreateResetEvent` and I wait for a hour but it can not run.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.