以异步方式在wpf中加载tableadapter

时间:2015-10-14 11:42:32

标签: c# wpf asynchronous tableadapter contextswitchdeadlock

我正在尝试加载表适配器asynchronously。我使用了await方法。

的Xaml:

<ComboBox x:Name="IDComboBox" Grid.Column="1" DisplayMemberPath="ID" HorizontalAlignment="Left" Height="Auto" ItemsSource="{Binding}" Margin="3" Grid.Row="0" VerticalAlignment="Center" Width="120"   Background="White" IsEditable="True" >
            <ComboBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel/>
                </ItemsPanelTemplate>
            </ComboBox.ItemsPanel>
        </ComboBox>

代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        loadData();
}
private async void loadData()
{
        // Load data into the table TBLPOOL. You can modify this code as needed.
        commercialDataSet = ((Cobra.CommercialDataSet)(this.FindResource("commercialDataSet")));


        var loadTblPool = Task<int>.Factory.StartNew(() => commercialDataSetTBLPOOLTableAdapter.Fill(commercialDataSet.TBLPOOL));
        await loadTblPool;
        tBLPOOLViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("tBLPOOLViewSource")));
        tBLPOOLViewSource.View.MoveCurrentToFirst();

}

以上确实加载了数据异步,但问题是我在组合框中有一个ID字段。当我按下组合框选择和ID程序锁定。当我调试应用程序时,我得到一个&#34; ContextSwitchDeadLock发生&#34;。我看起来错了,显然它发生在一个过程花费太长时间。不知道为什么会这样。如果我不加载数据异步,组合框就可以正常工作。

1 个答案:

答案 0 :(得分:0)

我通过刷新viewsource来加载它。

((System.Windows.Data.CollectionViewSource)(this.FindResource("ViewSource"))).View.Refresh();