gpt4 book ai didi

c# - 中止正在运行长查询的线程

转载 作者:太空狗 更新时间:2023-10-29 22:36:49 30 4
gpt4 key购买 nike

我有一个调用其中一个方法的线程,现在这个方法执行一个可能需要很长时间才能完成的查询,可能需要 40 分钟左右,

我想给用户一个选择,以便能够取消此操作(意味着停止线程并停止查询以释放数据库)。

我应该提到我正在使用 .net 4.5、SQL SERVER DB 和 C# 开发 WPF 应用程序。

最佳答案

你应该使用 backgroundworker ,这正是您想要的。

Eather 从工具箱中拖放它或在后面的代码中创建它。它支持取消、报告进度、完成时通知并知道它是否正在运行。

这是一个例子。

void method(){
BackgroundWorker worker = new BackgroundWorker();
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.DoWork += worker_DoWork;
worker.WorkerSupportsCancellation = true;
if(!worker.IsBusy)
{
worker.RunWorkerAsync();
}
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
//do whatever needs to be done on the other thread here.
object argument = e.Argument; //if passed argument in RunWorkerAsync().
object result = new object();
e.Result = result;
//after making worker global, you can report progress like so:
worker.ReportProgress(50); //you can also pass a userState, which can be any object, to show some data already.
}

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//you can update a progress bar in here
int progress = e.ProgressPercentage;

}

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//when done
}

void CancelTheTask()
{
if (worker.IsBusy)
{
//make worker global first, but then
worker.CancelAsync();
}
}

需要注意的重要事项:切勿在 DoWork 方法中使用不是在其中创建的资源。因此,将您需要的东西作为参数传递给后台工作人员。后台创建的东西不应该设置为全局变量ether,通过结果传递。

取消时,RunWorkCompleted 也将被触发。现在对数据库的查询已经在执行,因此它仍在运行,即使您的应用程序失去了所有资源。

要取消它,我们需要知道您如何执行查询,例如 @S.Akbari提到的是一种方式。 Entity Framework 6 还支持取消。

为此:check this when using Queryable

here is another example

或者这个solution没有 Entity Framework 。

关于c# - 中止正在运行长查询的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30679773/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com