由于在另一个线程中创建了ReportViewr,因此在Windows布局发生变化时,在非常复杂的WPF应用程序中挂起未知位置

Saw*_*wan 7 .net c# wpf reportviewer hang

我有一个非常复杂的XAMLs WPF应用程序,我需要一种方法来知道我的应用程序挂起,当我尝试暂停执行点,应用程序似乎不能挂,指针会在这一行:

System.Windows.Application myApp;
.
.
.
.
myApp.Run(); // <== this line
Run Code Online (Sandbox Code Playgroud)

当我改变了任务栏的布局,或者当Windows资源管理器崩溃(任务栏是隐藏的),如果我在重重复做这些改动之后,应用程序将永远无法恢复,但是当小改完成后,应用程序这是发生会在几分钟后恢复,我需要知道这个问题的原因,我怀疑我的应用程序的复杂XAML,但我需要一种方法来了解页面或组件,或者这个挂起的来源.

*编辑*

我需要一种工具或方法来了解消耗调度时间的XAML是什么!

*编辑*

我有窍门的确切原因,那是因为在另一个线程创建的ReportViewer的一个实例,当我删除了实例的创建的,它的工作完美,很奇怪的,这个错误在我的应用程序很长一段时间存在以前,但最近提出了挂起,我的意思是:当我在我的应用程序的任何位置插入其中一个代码时,我的应用程序将挂起:

        new Action(() =>
        {
            ReportViewer rv = new ReportViewer();
        }).BeginInvoke(null, null);
Run Code Online (Sandbox Code Playgroud)

要么

        new Action(() =>
        {
            ReportViewer rv = new ReportViewer();
            rv.Dispose();
        }).BeginInvoke(null, null);
Run Code Online (Sandbox Code Playgroud)

要么

        new Action(() =>
        {
            ReportViewer rv = new ReportViewer();
            rv.LocalReport.ReleaseSandboxAppDomain();
            rv.Dispose();
        }).BeginInvoke(null, null);
Run Code Online (Sandbox Code Playgroud)

我的问题:

1-更改窗口布局(调整任务栏大小或移动它)与未添加到任何可视树的报表查看器之间的关系是什么,为什么这会导致我的应用程序挂起?

2-我如何确定挂机的位置?

3-有时候应用程序会在几分钟内恢复(3-5),但有时会挂起几个小时并且应用程序无法恢复,为什么?

4-在这种情况下,如何确定导致应用程序挂起的组件或配置?

顺便说一下,如果解决这个问题,这对其他人来说非常有用,我们花了很多时间来检测它,但没有得到导致挂起的ReportViewer的确切原因!

Moh*_*mad 7

我会尽力回答你的问题:

ReportViewer控件是一个Windows窗体控件,Windows窗体的问题可能会在适当的情况下导致UI线程锁定,从而导致应用程序挂起.

当Windows发布WM_SETTINGCHANGED消息时,该事件System.Win32.SystemEvents.UserPreferenceChanged将被触发.某些Windows窗体控件包括ReportViewer在系统设置更改时侦听此事件以自行更新.

UserPreferenceChanged相对于其他普通事件的事件和将调用使用订阅线程的SynchronzationContext每个处理程序.因此,如果ReportViewer是在主UI线程以外的线程上创建的(WPF中的Dispatcher线程),则事件触发代码将尝试执行调用并等待调用完成,这将永远不会发生在该其他线程上,从而冻结UI .

要确定挂起的位置,您可以轻松地禁用"在Visual Studio中启用我的代码 - >工具 - >选项 - >调试"选项,当发生挂起时,只需将VS调试器附加到挂起的应用程序,这将显示应用程序挂在WaitOne调用上的UserPreferenceChanged事件处理中.

您可以在这些文章中阅读有关此挂钩的更多信息:

http://www.ikriv.com/dev/dotnet/MysteriousHang.html

从另一个线程调用show后,Windows窗体窗体挂起