我在我的应用程序中实现了线程抓取网站。在所有的网站报废后,我想处理它们。线程进度到GUI
表单创建队列工(创建2个工作者并处理任务)。 完成所有任务后,我想要在formthread中处理它们。 在这一点上我与
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();
}
}
accieved这个任务被预制后,我火了(从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++;
}
}
的问题是formthread被阻塞,并调用Invoke,现在整个应用程序处于死锁状态。
如何,我可以给更新到formthread无需死锁,并有immidiate更新(如果的BeginInvoke工人线程完成时)
我用这个连接'easy'等待一切都完成了。 因此,在窗体中创建一个UrlScanningComplete处理程序。如果所有的任务都完成了,那么从排队工发出一个事件? – RvdK 2009-02-06 12:43:30