我正在编写的网络爬虫中使用ActionBlock。
有时当我打电话
actionBlock.Completion.Wait();
我收到以下错误
发生一个或多个错误。
内在的例外是
System.Threading.Tasks.TaskCanceledException:任务被取消。
这是下面的完整代码块。
actionBlock = new ActionBlock<URLsToCheckObject>(URLToCheck =>
{
try
{
// get more urls etc here and post below
actionBlock.Post(new URLsToCheckObject { URLAddress = CleanURL, Host = host });
if (actionBlock.InputCount == 0) actionBlock.Complete();
}
catch (Exception ex)
{
try
{
Logger.AddToDebugLog("Block 3 catch...", WebsiteToCrawl);
}
catch { }
}
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 3, CancellationToken = cancellationSource.Token });
actionBlock.Post(new URLsToCheckObject { URLAddress = WebsiteToCrawl.website, Host = host });
try
{
Logger.AddToDebugLog("Waiting on action block..", WebsiteToCrawl);
actionBlock.Completion.Wait();
}
catch (Exception ex)
{
try
{
Logger.AddToDebugLog("Block 4 catch..." + ex.Message, WebsiteToCrawl);
}
catch { }
try
{
Logger.AddToDebugLog("Block 4 catch..." + ex.InnerException, WebsiteToCrawl);
}
catch { }
try
{
Logger.AddToDebugLog("Block 4 catch...", WebsiteToCrawl);
}
catch { }
}
为什么包裹了内容的try / catchActionBlock
不能捕获此异常?
异常通常来自:
cancellationToken.ThrowIfCancellationRequested();
因为您没有CancellationToken
在lambda内部使用内部,但是将其用作以下参数:
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 3, CancellationToken = cancellationSource.Token }
对TaskCanceledException
不是来自你的拉姆达(但可能从内部ExecutionDataflowBlockOptions
或ActionBlock
),所以它是拉姆达里面你的try / catch的范围之内,所以也没有赶上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句