웹 사이트를 긁어 모으기 위해 내 응용 프로그램에서 스레딩을 구현했습니다. 모든 사이트가 스크랩 된 후 처리해야합니다.GUI로 진행하는 스레드
양식은 queueworker (2 명의 작업자를 생성하고 작업을 처리)를 만듭니다. 모든 작업이 끝나면 formack에서 baack을 처리하려고합니다.
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++;
}
}
문제는 작업이 내가 (queueworker에서) 발사 미리 형성 한 후이 시점에서 나는
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 formthread가 막히고 Invoke를 호출하면 전체 애플리케이션이 교착 상태에 처하게됩니다.
어떻게 교착 상태를하지 않고 formthread에 대한 업데이 트를주고
'쉬운 일'을 위해 모든 것을 수행하기 위해 조인을 사용했습니다. 그래서 양식에 UrlScanningComplete 처리기를 만듭니다. 그리고 모든 작업이 완료되면 queueworker에서 이벤트가 발생합니까? – RvdK
그런 접근법은 괜찮지 만 폼에서 실제 작업을하기 전에 어느 시점에서 UI 스레드 (Invoke/BeginInvoke)로 전환해야합니다. –