当前位置: 首页 > 面试题库 >

如何最好地在后台执行查询以不冻结应用程序(.NET)

宋俊艾
2023-03-14
问题内容

我的WinForm应用程序需要执行耗时较长的复杂查询,我没有影响力(大约10分钟)。执行查询时,用户在任务管理器中看到``应用程序无响应’‘,这确实使用户感到困惑,也不是很专业…

我相信查询应该在不同的线程中执行。已经尝试了一些方法,但是很难使其真正起作用(执行查询,强制主应用程序等待结果,返回主应用程序,取消执行等)

我想知道您是否为此拥有自己的/良好的解决方案。 代码示例也将非常受欢迎 :)

我也相信可能存在一些可以立即使用的实用程序/框架。


问题答案:

如果ExecuteQuery要执行的方法,可以执行以下操作:

void SomeMethod() {
    var thread = new Thread(ExecuteQuery);
    thread.Start();
}

void ExecuteQuery() {
    //Build your query here and execute it.
}

如果ExecuteQuery收到一些参数,例如:

void ExecuteQuery(string query) {
    //...
}

你可以做:

var threadStarter = () => { ExecuteQuery("SELECT * FROM [Table]"); };
var thread = new Thread(ThreadStarter);
thread.Start();

如果要停止后台线程的执行,请避免调用thread.Abort()method。这将使kill线程运行,并且您不希望这样做,因为某些不相容性可能会出现在数据库中。

相反,您可以从外部和外部bool看到一个变量,ExecuteQuery可以将其设置为True要停止的时间。然后,您所要做的就是检查代码中的某些部分ExecuteQuery是否仍然存在True。否则,请做一些
回滚 以保持数据库的稳定。

确保设置该bool变量volatile

编辑:
如果您希望UI从后台线程 等待 ,我通常会这样做:

  • 启动后台线程
  • 在用户界面中启动一些进度栏
  • 禁用 某些控件(例如按钮等),以避免用户在后台线程运行时单击它们(例如:如果在用户单击按钮时执行线程,则应禁用该按钮,否则将进行多个查询同时发生)。

线程完成后,您可以停止进度栏并再次启用控件。

如何知道线程何时完成?您可以为此使用事件。只需创建一个事件并在事件结束时将其触发,然后在事件处理程序中执行任何操作即可…

确保 从后台线程正确访问UI控件,否则将给您带来错误。



 类似资料:
  • 问题内容: 我为我的一个脚本创建了一个小GUI。一切都很好。 当我单击一个按钮时,它会启动一个很大的功能,该功能正在解析某些网站中的许多数据。 但是,一旦我单击了Button,程序就会冻结,直到该功能完全运行为止。一切正常,但是为什么我的GUI在执行功能时冻结了。我想打印一个进度条,但这是不可能的。 这是程序的一部分: 在执行Module_1.main()时,我无法执行任何操作//打印任何内容…

  • 问题内容: 如何在不冻结程序的情况下用Java执行进程?我已经尝试过使用SwingWorker,但是我还不太了解它是如何工作的。 我还有其他方法可以做到这一点吗?我想在我的JDroidLib中使用类似的东西。有关完整的源代码,请查看GitHub:http : //github.com/Team-M4gkBeatz/JDroidLib 提前致谢! 编辑: 感谢您的回答。但是我有一个带有几种方法的类(

  • 问题内容: 是否有任何查询/方式来显示 所有 服务器上执行的最后一个查询? 问题答案: 对于那些拥有MySQL> = 5.1.12的用户,可以在运行时全局控制此选项: 执行 执行 看看桌子 如果您希望输出到文件而不是表: 默认值 。 我更喜欢这种方法来编辑.cnf文件,因为: 您没有编辑文件,并可能永久打开日志记录 您不会在文件系统中四处寻找查询日志-甚至更糟的是,由于需要完美的目的地而分心。 您

  • 我已经为我的一个脚本创建了一个小GUI。一切进展顺利。 当我点击一个按钮时,它会启动一个大功能,解析一些网站的大量数据。 但一旦我点击了按钮,程序就会冻结,直到函数完全运行。一切正常,但为什么我的GUI在函数执行过程中会冻结。我想打印一个小进度条,但这是不可能的。 以下是该计划的一部分: 在执行模块_1期间,我无法执行/打印任何内容。main()。。。GUI完全冻结。 模块1。main()函数是一

  • 问题内容: 执行查询后,PostgreSQL JDBC驱动程序 版本9.2-1002什么时候从服务器获取行?它是在查询执行后立即(在客户端应用程序调用之后)还是在客户端应用程序第一次调用以从结果集中检索行之后获取行?这是否取决于语句访存大小的值? 问题答案: 如以下程序所示,始终从服务器检索结果集中的行。该程序还演示了语句获取大小如何影响行检索。如果该语句的默认访存大小为零,则从服务器检索所有行,

  • 我的应用程序使用firebase实时数据库,我设置PersistenceEnabled(true)使其在设备脱机时仍能工作。设备脱机时一切正常,添加、更改和删除数据等操作都可以正常工作。 当设备在做了太多操作后回到在线时,问题就来了,例如离线时删除了很多数据。当我看到我的实时数据库中的许多数据被同时删除后,我不能进行几次(5-10分钟)添加和更改数据等操作,这取决于离线时我删除了多少数据。我只能看