我使用BackgroundWorker但报告取消时遇到问题:
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
expensiveMethod();
}
DoWork应定期检查取消请求是否有待处理。怎么做,如果我不能修改昂贵的方法?
答案 0 :(得分:2)
如果您无法修改expensiveMethod()
,则无法直接处理取消。
如果expensiveMethod()
正在处理大量数据,也许您可以拆分该数据并在循环中处理较小(不那么冗长)的块,并在每次迭代后检查取消标记。像这样:
//...
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
do
{
provideNextChunk();
expensiveMethod();
}
while (hasMoreData && !args.Cancel);
}
答案 1 :(得分:1)
BackgroundWorker旨在使用实际可以响应取消请求的线程。如果您的昂贵的方法()无法做到,我建议您改用System.Threading.Thread。将其作为background主题运行,并使用Thread.Abort()取消它。
答案 2 :(得分:0)
使用Task。任务使用ThreadPool中的线程(例如BackgroundWorker),但它们支持取消(通过CancellationToken),而无需例外。