【发布时间】:2013-12-24 15:48:04
【问题描述】:
我遇到了一个不知道如何解决的问题。我有一个方法,其中包含来自填充数据表的服务的调用,例如:
private void GetCases()
{
try
{
//Setup our criteria
Web_search_criteria myCriteria = new Web_search_criteria()
{
Keynum = 9, //Use Opening Date Key
Range_start = "20100101", //01-01-2010
Range_end = "20121223" //12-23-2013
};
//The myCases object is a datatable that is populated from the GetCasesDT() call.
int status = db.server.GetCasesDT(myCriteria, ref myCases);
}
catch (Exception ex)
{
XtraMessageBox.Show("Unable to get data: " + ex.Message);
}
}
所以,如您所见,我无法一次只抓取几个箱子 - 它只是抓取所有箱子。
现在,我在 BackgroundWorker 的 DoWork 事件中调用了这个方法,并且我显示了另一个带有选取框进度条的表单,以便用户知道系统实际上正在执行某些操作。在该表单上,我有一个订阅的取消按钮。这是执行此操作的代码:
backgroundWorker1 = new BackgroundWorker()
{
WorkerSupportsCancellation = true,
WorkerReportsProgress = true
};
//DoWork Event
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
//Show the progress bar with subscription to event
pb.btnCancel.Click += this.CancelBW;
pb.Show();
//Run the backgroundworker
this.backgroundWorker1.RunWorkerAsync();
//Don't lock up the application
while (this.backgroundWorker1.IsBusy)
{
Application.DoEvents();
}
我曾尝试使用 CancelAsync() 来取消 CancelBW 事件中的 BackgroundWorker,但后来我阅读了更多内容并意识到这不起作用,并且只有在我可以中断初始调用以便 BackgroundWorker 可以检查时才会起作用进展。
我曾考虑过使用线程而不是 BackgroundWorker,但读到中止线程会导致小猫自燃。
那么,对于我来说,处理这个用户可能会取消一个漫长的过程的最佳方法是什么?
【问题讨论】:
-
+1 表示小猫自燃。 (现在有一条我从未想过会放到互联网上的台词。)
-
您使用的是什么版本的 .NET/C#?如果是 .NET 4.0/4.5,您可以尝试使用包含取消令牌支持的任务。
-
@ledbutter 感谢您的建议。我使用的是 4.0,所以我将看一下 Tasks 类,看看它是如何工作的。
-
深思熟虑:这可能与您的应用程序的目标背道而驰,并且肯定会改变用户体验,但您也可以考虑分页。如果他们给出的日期范围大于 XX 天,您只需请求 30 天,并使用“更多”或“下一步”按钮来获取更多数据。 或者 可以在完成后自动链接 30 天的请求,因此当您升级到完整的 3 年数据时,您会立即显示数据。不是您问题的答案,而是另一种看待大局的方式。
标签: c# multithreading process backgroundworker