ComboBox打开时间太长(COMException错误)

时间:2012-04-16 12:04:11

标签: c# combobox contextswitchdeadlock

以下是我的问题:
我有一个ListBox,其中有两个MyClass类型的项目 MyClass有一个List<Column>集合 在同一窗口的其他位置,我有一个ComboBox,其中所选MyClass.ColumnCollection的列为ItemsSource。

这是麻烦开始的地方:
我第一次打开ComboBox的弹出窗口一切顺利 当我在ListBox中选择其他项目(以及更改ComboBox源)时,打开弹出窗口需要10秒以上的时间。 如果花费的时间超过60秒,我会收到以下错误:

The CLR has been unable to transition from COM context 0xf13d90 to COM context 0xf13fe0 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

我用Google搜索了错误,无论我来到哪里都是禁止抛出ContextSwitchDeadlocks的建议,这根本不是解决方案!

我进一步研究了这个并发现了以下COMException:

An event was unable to invoke any of the subscribers (Exception from HRESULT: 0x80040201)

我不使用线程/任务或其他任何东西,只是绑定ComboBox 我尝试在选择另一个项目时刷新ItemsSource,但它没有任何区别,因为它已经设置正确。

我试图谷歌这个错误,但似乎没有解决这个问题的方法 微软为此提供了hotfix,但没有下载。

ListBox的代码:

    <ListBox Margin="468,30,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="420" Width="410"
                            ItemsSource="{Binding ElementName=Window, Path=MyClassItems}"
                            SelectedItem="{Binding ElementName=Window, Path=MyClassItem}"
                            DisplayMemberPath="Name" />

ComboBox的代码:

        <ComboBox Margin="580,490,0,0" Width="300"
                            VerticalAlignment="Top" HorizontalAlignment="Left" DisplayMemberPath="Name"
                            ItemsSource="{Binding ElementName=Window, Path=MyClassItem.Columns}"
                            SelectedItem="{Binding ElementName=Window, Path=MyClassItem.Column, Mode=OneWay}" SelectionChanged="SelectedColumn_SelectionChanged" />

SelectionChanged事件:

MyClassItem.Column = (sender as Combobox).SelectedValue as Column;

问题:
有人知道如何防止COMException吗?

更新1:
添加了一些Xaml代码示例

更新2:
简化了问题

更新3:
我发现真正的错误是COM异常 用新信息更新了我的问题。

更新4:
ListBox中的所有对象都是完整的并且存在于内存中,因此没有查询。此外,无论组合框中是否填充了1或100个项目,总是会发生等待时间。 (我测试了两个)。

0 个答案:

没有答案