C# 将大量数据加载到WPF数据网格

C# 将大量数据加载到WPF数据网格,c#,sql,wpf,bigdata,C#,Sql,Wpf,Bigdata,我有4个sql查询可以获取相当数量的数据,其中两个分别需要30秒和60秒 我打算缓存大量数据,以便在初始加载后不会花费那么长时间 但是,初始加载仍然需要很多时间,因此我想知道从SQL Server获取这4个数据表并将其加载到4个单独的WPF数据网格中的最佳方法是什么? 我不认为从sql查询本身的性能方面可以获得多少好处。它们是非常简单的选择,但瓶颈是另一个网络上链接服务器上的连接 这仅仅是异步运行每个查询并加载它们的问题,还是有更好的方法?将其形式化;您的瓶颈在于后端设计,与前端应用程序无关。更

我有4个sql查询可以获取相当数量的数据,其中两个分别需要30秒和60秒

我打算缓存大量数据,以便在初始加载后不会花费那么长时间

但是,初始加载仍然需要很多时间,因此我想知道从SQL Server获取这4个数据表并将其加载到4个单独的WPF数据网格中的最佳方法是什么?

我不认为从sql查询本身的性能方面可以获得多少好处。它们是非常简单的选择,但瓶颈是另一个网络上链接服务器上的
连接


这仅仅是异步运行每个查询并加载它们的问题,还是有更好的方法?

将其形式化;您的瓶颈在于后端设计,与前端应用程序无关。更改后端设计,使应用程序在每次启动应用程序实例时不再需要服务器之间的连接。这可以是一个简单的可执行文件,定期在数据库服务器上运行,并维护一个缓存表,您的前端可以在一次点击中检索到该缓存表,也可以是一个完整的服务,您的应用程序可以通过该服务访问数据库


此外,由于数据仅每24小时更新一次,而且可能仍然是一个需要移动的相当大的数据块,因此在每个最终用户计算机上维护一个本地缓存,该缓存仅在其比数据的上一个中央版本旧时才被刷新。

将其正式化;您的瓶颈在于后端设计,与前端应用程序无关。更改后端设计,使应用程序在每次启动应用程序实例时不再需要服务器之间的连接。这可以是一个简单的可执行文件,定期在数据库服务器上运行,并维护一个缓存表,您的前端可以在一次点击中检索到该缓存表,也可以是一个完整的服务,您的应用程序可以通过该服务访问数据库


此外,由于数据仅每24小时更新一次,而且可能仍然是一个需要移动的相当大的数据块,因此在每个最终用户计算机上维护一个本地缓存,该缓存仅在其比数据的上一个中央版本旧时才被刷新。

将其正式化;您的瓶颈在于后端设计,与前端应用程序无关。更改后端设计,使应用程序在每次启动应用程序实例时不再需要服务器之间的连接。这可以是一个简单的可执行文件,定期在数据库服务器上运行,并维护一个缓存表,您的前端可以在一次点击中检索到该缓存表,也可以是一个完整的服务,您的应用程序可以通过该服务访问数据库


此外,由于数据仅每24小时更新一次,而且可能仍然是一个需要移动的相当大的数据块,因此在每个最终用户计算机上维护一个本地缓存,该缓存仅在其比数据的上一个中央版本旧时才被刷新。

将其正式化;您的瓶颈在于后端设计,与前端应用程序无关。更改后端设计,使应用程序在每次启动应用程序实例时不再需要服务器之间的连接。这可以是一个简单的可执行文件,定期在数据库服务器上运行,并维护一个缓存表,您的前端可以在一次点击中检索到该缓存表,也可以是一个完整的服务,您的应用程序可以通过该服务访问数据库


此外,由于数据仅每24小时更新一次,而且可能仍然是一个需要移动的大数据块,因此在每个最终用户计算机上维护一个本地缓存,只有当该缓存比数据的上一个中央版本旧时才会刷新。

在get中,您可以运行查询异步
这可能是最有效的方法

您可能想了解优先级绑定

另一个选项是使用BackgroundWorker在backgound中检索数据表。

对于4个数据表,您有一些选择。
您可以一次将它们全部烧掉。

或者你可以在前一个事件的完整事件中触发下一个

在get中,您可以异步运行查询
这可能是最有效的方法

您可能想了解优先级绑定

另一个选项是使用BackgroundWorker在backgound中检索数据表。

对于4个数据表,您有一些选择。
您可以一次将它们全部烧掉。

或者你可以在前一个事件的完整事件中触发下一个

在get中,您可以异步运行查询
这可能是最有效的方法

您可能想了解优先级绑定

另一个选项是使用BackgroundWorker在backgound中检索数据表。

对于4个数据表,您有一些选择。
您可以一次将它们全部烧掉。

或者你可以在前一个事件的完整事件中触发下一个

在get中,您可以异步运行查询
这可能是最有效的方法

您可能想了解优先级绑定

另一个选项是使用BackgroundWorker在backgound中检索数据表。

对于4个数据表,您有一些选择。
您可以一次将它们全部烧掉。

或者你可以在前一个事件的完整事件中触发下一个

调用从数据库获取数据的方法时,请使用Task Parallel Library,该操作将在TPL创建的单独线程上执行

using System.Threading.Tasks;
...
Task.Factory.StartNew(() => GetLotsOfRecordsFromDB()).
            ContinueWith(t => ...);
如果需要访问UI线程,请使用
ContinueWith
中的
TaskScheduler.FromCurrentSynchronizationContext()


这是迄今为止最简单、最不冗长的方法…

当您调用从数据库获取数据的方法时,请使用Task Parallel Library,该操作将在TPL创建的单独线程上执行

using System.Threading.Tasks;
...
Task.Factory.StartNew(() => GetLotsOfRecordsFromDB()).
            ContinueWith(t => ...);
如果需要访问UI线程,请使用
ContinueWith
中的
TaskScheduler.FromCurrentSynchronizationContext()

这是迄今为止最简单、最起码的