Я реализовал многопоточность в своем приложении для очистки веб-сайтов. После того, как все сайты удалены, я хочу обработать их.
форма создает 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();
}
}
После того, как задание выполнено, я запускаю (из очереди):
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 все приложение теперь находится в тупиковой ситуации.
Как я могу дать обновление формы, не имея тупиков, и получить немедленное обновление (begininvoke происходит, если рабочие потоки завершены)