Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从SQL获取大量数据时WPF中的COM上下文转换错误_C#_Sql_Wpf_Timeoutexception - Fatal编程技术网

C# 从SQL获取大量数据时WPF中的COM上下文转换错误

C# 从SQL获取大量数据时WPF中的COM上下文转换错误,c#,sql,wpf,timeoutexception,C#,Sql,Wpf,Timeoutexception,我正在开发wpf应用程序。此应用程序用于显示报告。为此,我有两个选项卡:一个选项卡选择listview中的列,另一个选项卡显示sql表中的结果。在这里,对于动态查询,我在服务器端进行查询,并将其作为参数传递到存储过程中,然后使用execute方法执行它 问题: 如果我从总共170个列中选择了一些列,效果会很好,但当我在列表视图中选择所有列并尝试转到其他选项卡时,它仍在同一选项卡上,并引发异常: The CLR has been unable to transition from COM cont

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

问题:

如果我从总共170个列中选择了一些列,效果会很好,但当我在列表视图中选择所有列并尝试转到其他选项卡时,它仍在同一选项卡上,并引发异常:

The CLR has been unable to transition from COM context 0xc40048 to COM context
0xc401b8 for 60 seconds. 
有数千行用于此

问题:

1.)如何快速执行查询


2.)使表更快地查找数据的步骤。

在尝试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消息泵送的COM规则

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

如何快速执行:

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


在表上创建缺少的索引

在此表上创建索引视图

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


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

在尝试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消息泵送的COM规则

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

如何快速执行:

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


在表上创建缺少的索引

在此表上创建索引视图

你也可以参加聚会