0

我正在处理wpf应用程序。此应用程序用于显示报告。为此,我有两个选项卡:一个选项卡用于选择列listview和其他过滤器,第二个选项卡显示sql表中的结果。对于动态查询,我在服务器端进行查询并将其作为参数传递到存储过程中,我正在使用执行方法执行它。

问题 :

如果我从总共 170 列中选择一些列,它工作正常,但是当我选择列表视图中的所有列并尝试转到其他选项卡时,它仍保留在同一选项卡上并引发异常:

The CLR has been unable to transition from COM context 0xc40048 to COM context
0xc401b8 for 60 seconds. 

有数千行为此获取。

问题 :

1.)我如何使查询的执行速度更快。

2.)使表格更快地填充数据的步骤。

4

4 回答 4

3

在尝试的 COM 上下文转换期间检测到死锁时,将激活 contextSwitchDeadlock 托管调试助手 (MDA)。

症状

最常见的症状是从托管代码对非托管 COM 组件的调用不返回。另一个症状是内存使用量随着时间的推移而增加。

原因

最可能的原因是单线程单元 (STA) 线程未泵送消息。STA 线程要么正在等待而不发送消息,要么正在执行冗长的操作,并且不允许消息队列发送。

内存使用量随时间增加的原因是终结器线程尝试在非托管 COM 组件上调用 Release 并且该组件未返回。这可以防止终结器回收其他对象。

默认情况下,Visual Basic 控制台应用程序的主线程的线程模型是 STA。如果 STA 线程通过公共语言运行库或第三方控件直接或间接使用 COM 互操作性,则会激活此 MDA。要避免在 Visual Basic 控制台应用程序中激活此 MDA,请将 MTAThreadAttribute 属性应用于 main 方法或修改应用程序以泵送消息。

当满足以下所有条件时,此 MDA 可能被错误激活:

· 应用程序从 STA 线程直接或通过库间接创建 COM 组件。

· 应用程序在调试器中停止,用户要么继续应用程序,要么执行单步操作。

· 未启用非托管调试。

要确定 MDA 是否被错误地激活,请禁用所有断点,重新启动应用程序,并允许它在不停止的情况下运行。如果 MDA 没有被激活,很可能最初的激活是错误的。在这种情况下,请禁用 MDA 以避免干扰调试会话。

解析度

遵循关于 STA 消息泵送的 C​​OM 规则。

要避免出现这些错误弹出窗口,请从 Visual Studio 窗口的“调试”菜单中选择“异常”,然后在“异常对话框”中选择“托管调试助手异常节点”。然后选择 ContextSwitchDeadlock 并从 Thrown 列中删除选择。

在此处输入图像描述

如何快速执行:

有很多方法可以做到这一点

在表上创建缺失的索引。

在此表上创建索引视图。

您还可以根据数据范围对表进行分区。

将此表放在其他磁盘上,以便数据读取/写入会很快。

于 2012-05-09T12:17:04.433 回答
1

一些想法:

  • 使用BackgroundWorker类并使用DispatcherWPF 中的。
  • 对结果进行分页 - 您还可以创建无限滚动效果
  • 使用 DataReader 而不是 DataSet
  • 隐藏/禁用选项卡 2 上的控件呈现,绑定数据,重新启用控件。在 WinForms 中,您将使用SuspendLayout/ResumeLayout
  • 更改 UI - 我无法想象人类如何处理 170 列……也许您可以提供更好(通常更简单)的数据表示

最终,您需要确定性能问题在调用堆栈中的哪个位置。Visual Studio 调试器应该对此有所帮助,但您可能需要使用其他一些工具。使用 SQL Profiler 分析您的存储过程/SQL Server 行为。对于网络连接,请尝试使用 WireShark 之类的方法。

编辑:添加了 Dispatch/BackgroundWorker 链接---您仍然需要知道超时发生的位置。

于 2012-05-09T12:32:11.240 回答
0

好吧,如果你想让你的数据库调用更高效,我建议你试试 Enterprise Library,目前的版本是 5.0。与我们的应用程序配合得很好。

http://msdn.microsoft.com/en-us/library/ff648951.aspx

于 2012-05-09T12:19:56.893 回答
0

我个人建议您在 SQL 级别而不是在应用程序本身过滤结果,尽管这里有几个答案也会提高您在应用程序端的性能,应该遵循它们。

有关使用 SQL 分页的示例代码,请参阅T-SQL:使用 ROW_NUMBER() 进行分页

于 2012-05-09T12:34:49.330 回答