c# - 取消正在进行密集操作的后台工作人员
问题描述
我有一个带有 2 个网格的 winform,我有一个后台工作人员,用于从我们的数据库中检索大量数据。当用户从左侧网格更改行时,后台工作程序启动(它将行作为 SQL 过程的参数),一旦完成,数据表将与右侧网格的绑定源合并并显示信息。
这是我的代码:
// Called when left grid focused row changes
public void LaunchTransactionWorker(int rowId)
{
if (!backgroundWorker.IsBusy)
{
backgroundWorker.RunWorkerAsync(rowId);
}
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = tableAdapterLog.GetData((int)e.Argument);
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
var dataTable = (ds.DataTableTransactionsLog)e.Result;
if (dataTable != null)
{
ds.DataTableLog.Clear();
ds.DataTableLog.Merge(dataTable);
}
}
如您所见,我的DoWork
函数只做一件事。据我了解(我可能错了),后台工作人员启动了一个执行该DoWork
功能的新线程。在那里我可以查看取消标志是否被抬起并停止它。但是我怎么能阻止它,如果它会很忙Fill
呢?如果我添加支票if (backgroundWorker.CancellationPending) e.Cancel = true;
,它永远不会达到否?
解决方案
推荐阅读
- angular - 使用 ngFor 添加 mat-slide-toggle 时防止动画
- c# - 如何禁用 ListBox 中的按键导航但继续检测按键事件?
- tableau-api - Tableau elseif 语句
- powerbi - Power BI / Power Query [M 代码] - 添加基于源的自定义列
- docker - Dockerfile - 如何定义主机文件系统到容器的挂载
- jquery - 如果单击一次,如何获得返回 false 的链接,如果再次单击则返回 true?
- rest - 制作 Postman 测试 - Grails
- sonarqube - 如何将带有级联测试套件的 PHPUnit 报告导入 Sonarqube?
- javascript - 为什么反应不渲染元素?
- jsf - 关于值更改的 JSF 打开对话框