【发布时间】:2021-05-21 16:18:24
【问题描述】:
我得到 cItems,这是 Selenium 提供的 IReadOnlyCollection<IWebElement>。
然而。我制作了基于单线程的功能,它工作得很好。但现在我想提高性能,所以我选择了 .Net ThreadPool。
ThreadPool.SetMaxThreads(16, 16);
IEnumerator<IWebElement> iter = cItems.GetEnumerator();
while(iter.MoveNext()) {
cThreadJobObj.Item = iter.Current;
ThreadPool.QueueUserWorkItem(new WaitCallback(GetThreadJob), cThreadJobObj.Clone()); // .Clone() is a deep clone
}
现在的问题是,线程在第 5 行消失了。我认为没有抛出任何异常,我认为是因为没有调用 } catch (Exception Ex) { 块。
public static void GetThreadJob(object ThreadJob) {
try {
var cThreadJob = ThreadJob as ThreadJobObj;
var IWebElement = cThreadJob.Item;
var cElem = cItem.FindElement(By.CssSelector("span.im_message_date_text"));
} catch (Exception Ex) {
Rupert.Logger.E("{Thread.GetCurrentProcessorId()} on Obj {cThreadJob.iCount}", Ex, false);
}
}
GetThreadJob 被所有 16 个线程调用,并且全部消失在同一行。
更新
我在这个方法ISearchContext.FindElement Method中分离了行,线程消失了。
IWebElement.FindElement(By)
如果我在这条线上做一个快速观察,这就是价值:
cItem.FindElement(cSel) Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation. OpenQA.Selenium.IWebElement
【问题讨论】:
-
如果你在调试器中运行它并设置了“Break on throw”(调试菜单..异常.. CLR旁边的勾号),它会中断吗?
-
@CaiusJard 现在,我勾选了每一个。它们都消失在同一条线上。
-
但是线是什么?是否有任何异常被抛出?
-
@CaiusJard 没有抛出任何东西。
var cElem = cItem.FindElement(By.CssSelector("span.im_message_date_text"));在这里线程消失了。我可以看到,因为我在前后都做了一个Console.WriteLine。此外,在调试期间,进程切换到下一个等待线程。如果都通过了这一行,则程序正在等待 I/O,因为到达底部的回调。
标签: c# multithreading thread-safety threadpool