我在我的应用程序中实现了线程来抓取网站。在所有网站都被抓取之后,我想处理它们。
表单创建 queueworker(创建 2 个工作人员并处理任务)。完成所有任务后,我想在表单线程中处理它们。在这一点上,我接受了这个
public void WaitForCompletion()
{
// Enqueue one null task per worker to make each exit.
StopWorkers();
//wait for the workers to finish
foreach (Thread worker in workers)
{
worker.Join();
}
}
执行任务后,我触发(来自 queueworker):
public event EventHandler<ProgressEvent> UrlScanned;
if (UrlScanned != null)
{
UrlScanned(this, new ProgressEvent(task.Name, 1));
}
并通过以下方式捕捉该事件:
urlscanner.UrlScanned += new EventHandler<ProgressEvent>(UrlScanningProgress);
private void UrlScanningProgress(object sender, ProgressEvent args)
{
if (pbarurlScan.InvokeRequired)
{
//don't use invoke when Thread.Join() is used! Deadlock
Invoke(new MethodInvoker(delegate() { UrlScanningProgress(sender, args);
//BeginInvoke(new MethodInvoker(delegate() { UrlScanningProgress(sender, args)};
}
else
{
pbarurlScan.Value++;
}
}
问题是窗体线程被阻塞并且调用 Invoke 整个应用程序现在处于死锁状态。
如何在没有死锁的情况下对窗体线程进行更新并进行即时更新(如果工作线程完成,则会发生开始调用)