【发布时间】:2017-08-21 19:30:17
【问题描述】:
我使用 sql server 的应用程序位于服务器上。我的问题是使用此应用程序时,从服务器获取数据时冻结应用程序! 您提出的解决方案是什么?
【问题讨论】:
-
您应该提供一点代码,我们不能只为您猜测解决方案。另外,你试过了吗?也许向我们提供一些您的测试来检查您哪里出错了。
标签: c# mysql sql-server sql-server-2008 freeze
我使用 sql server 的应用程序位于服务器上。我的问题是使用此应用程序时,从服务器获取数据时冻结应用程序! 您提出的解决方案是什么?
【问题讨论】:
标签: c# mysql sql-server sql-server-2008 freeze
听起来您正在从 UI 线程执行数据库查询。也许,查询是在按钮“单击”操作处理程序中执行的?
UI 线程是运行 UI 消息循环并处理 UI 事件(如按钮单击、窗口大小调整等)的线程。如果您在 UI 线程中执行长时间运行的任务,它将阻止处理所有其他 UI 消息,直到任务完成。因此,UI 看起来会冻结。
数据库调用相当慢,最好在 UI 线程之外执行它们。一种解决方案是创建一个新线程,提供一个在查询执行完成后调用的回调方法。
更好的方法是使用 async/await。您必须定义一个执行数据库调用的异步方法。然后在您的 UI 线程中等待该方法。
请向我们展示您如何从数据库中获取数据,我们将为您提供有关如何在不阻塞 UI 的情况下实现它的更多详细信息。
【讨论】:
如果没有更多信息,这里是一般建议:
在线程上执行您的查询(如果是现代的,则使用任务),然后当线程获取它的数据时,它会在主/UI 线程上调用回来。这将防止您的 UI 在查询数据时锁定。
您可能还想在 UI 线程上启动某种“微调器”或“加载”指示器,这样用户就知道要等待并且不会疯狂地点击一次又一次地加载数据。 .
还要确保在您的查询线程中包含一些错误处理,这样如果出现问题,您可以恢复并发出警报(消息框、写入日志,无论您需要做什么)。
【讨论】: