title author date CreateTime categories
WPF shows that some windows in multithreading will be locked in the PenThreadWorker constructor when the application starts
lindexi
2019-06-14 08:50:36 +0800
2019-06-11 19:28:43 +0800
WPF

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

    public partial class App : Application
{
/// <inheritdoc />
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
  2. 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.
 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

    public partial class App : Application
{
/// <inheritdoc />
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.

最新文章

  1. 生产服务器环境最小化安装后 Centos 6.5优化配置[转]
  2. [OpenJudge 3066]随机序列
  3. POJ 3261 (后缀数组 二分) Milk Patterns
  4. AJAX请求也会重新刷新整个页面?
  5. Revit 2015 API 的全部变化和新功能
  6. Python3 操作Excel--openpyxl
  7. hdu_5110_Alexandra and COS(DP+分块思想)
  8. vue keep-alive内置缓存组件
  9. for ,foreach ,map 循环的区别
  10. SVN命令备忘录
  11. 安排~~炒鸡全的JS兼容问题,码上-----【XUEBIG】
  12. 给table加边框的样式
  13. Thinkphp 中的自动验证 上一篇有例子
  14. hive GenericUDF1
  15. Listary Pro- 文件浏览与搜索增强的超级神器
  16. Npm基本指令(转)
  17. IOPS、带宽(band width)、吞吐量 (throughput)
  18. 1106-冒泡算法C程序(语法树)
  19. leetcode-77-组合
  20. javascript屏蔽浏览器右键功能按钮

热门文章

  1. springboot mail 发送邮件
  2. vsftp 被动模式配置
  3. 能轻松背板子的FWT(快速沃尔什变换)
  4. .net下MVC中使用Tuple分页查询数据
  5. &quot;一个实用的却被忽略的命名空间:Microsoft.VisualBasic&quot;:
  6. Web开发-Servlet&amp;HTTP&amp;Request
  7. 面试系列 30 如何自己设计一个类似dubbo的rpc框架
  8. Python全栈开发:线程代码实例
  9. odoo 在更多下面直接调用方法
  10. [JZOJ3297] 【SDOI2013】逃考