3

这是我的问题的情况:
我有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.

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

我对此进行了进一步研究,发现了以下 COMException:

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

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

我试图用谷歌搜索这个错误,但似乎没有解决这个问题的方法。
微软为此提供了一个修补程序,但没有下载。

列表框的代码:

    <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 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 项,都会出现等待时间。(我测试了两者)。

4

0 回答 0