微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我的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()方法.这会杀死线程,你不希望这样,因为你的数据库中可能会出现一些错误.

相反,您可以从ExecuteQuery中看到一个bool变量,当您想要停止它时,可以从外部将其设置为True.然后你要做的就是检查ExecuteQuery中代码的某些部分,如果该变量仍为True.否则,执行一些回滚以保持数据库稳定.

一定要设置bool变量volatile

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

>启动后台线程
>在UI中启动一些进度条
>禁用一些控件(如按钮等)以避免用户后台线程工作时单击它们(例如:如果您在用户单击按钮时执行线程,则应禁用该按钮,否则多次查询将在同一时间出现).

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

怎么知道线程何时完成?您可以使用事件.只需创建一个事件并在它完成时触发它,并在事件处理程序中做任何你想做的事情……

确保您从后台线程正确访问UI控件,否则会出错.

原文地址:https://www.jb51.cc/mssql/80063.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐