我有一个连接到 SQL Server 的 WPF 应用程序;当我将多达 10 条记录加载到我的 DataGrid
时,我的应用程序运行良好且响应速度太快,但是当我加载所有行(几乎 1000 行)时,我的应用程序需要大约 15 秒来加载和卡住整个用户界面。
但是当我在 SQL Server 中执行相同的查询时,它只用了大约 00:00:00.490 秒来加载这 1000 行,这太快了。我已经做的如下,以避免 UI 卡住和快速执行查询。我做错了什么?由于我是 C# 世界的新手,请提供代码片段指导。
// Calling function to load data into DataGrid in a new thread,
// to make UI responsive.
String qry = "select * from institutes_tbl"
DataGrid dg = MainDataGrid;
Thread thread = new Thread(() => FunDataGrid_DataView(dg, qry));
thread.IsBackground = true;
thread.Start();
但不幸的是,我的用户界面显示消息“未响应”。下面是函数定义:
public void FunDataGrid_DataView(DataGrid dg, string qry)
{
Application.Current.Dispatcher.BeginInvoke
(
DispatcherPriority.Background,
new Action(() =>
{
try
{
con = new SqlConnection(con_string);
cmd = new SqlCommand(qry, con);
cmd.CommandTimeout = 12 * 3600;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
dg.ItemsSource = dt.DefaultView;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!",
MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
));
}
这是我的 XAML:
<DataGrid x:Name="DataGrid_View"
MouseLeftButtonUp="DataGrid_View_MouseLeftButtonUp"
ItemsSource="{Binding DATA_TBL}"
LoadingRow="DataGrid_View_LoadingRow" Grid.Row="2"
Grid.Column="0" ScrollViewer.CanContentScroll="False"
AutoGenerateColumns="False" CanUserAddRows="False"
Background="#7F179DB2" CellStyle="{StaticResource CellStyle}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding NAME}" Width="5*"/>
<DataGridTextColumn Header="Father Name"
Binding="{Binding F_NAME}" Width="5*"/>
<DataGridTextColumn Header="CNIC"
Binding="{Binding CNIC}" Width="5*"/>
</DataGrid.Columns>
</DataGrid>
我希望我的用户界面能够响应并且数据能够快速加载。我现在正在本地主机上工作。
最佳答案
启动新的后台线程从表中查询数据,如下所示:
Task.Factory.StartNew(() =>
{
try
{
con = new SqlConnection(con_string);
cmd = new SqlCommand(qry, con);
cmd.CommandTimeout = 12 * 3600;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
Application.Current.Dispatcher.BeginInvoke
(
DispatcherPriority.Background,
new Action(() => dg.ItemsSource = dt.DefaultView)
);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!", MessageBoxButton.OK,
MessageBoxImage.Warning);
}
});
关于c# - WPF C# 应用程序从 SQL Server 获取数据的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53362403/