2012-01-02 4 views
4

다른 하나가 완료된 후 BackgroundWorker을 시작하고 싶습니다. 나는 코드를 작성하는 방법에 대해 확신하지 못하기 때문에 보여줄 것이 전혀 없다.다른 하나가 완료된 후에 BackgroundWorker를 실행하십시오.

나는 이것을 RunWorkerCompleted에 쓰려고 생각했지만 다른 작업자를 시작하기위한 논리를 놓기에는 잘못된 장소처럼 보입니다.

어디서 어떻게해야합니까?

기본적으로 동일한 작업자를 사용하고 싶지만 다른 작업을 수행하려고합니다. 1 단계와 마찬가지로 파일에서 데이터를 파싱하고 2 단계에서 1 단계가 완료된 후 메모리에서 데이터베이스로 파싱 된 데이터를 작성해야합니다.

+2

다른 BGW를 시작할 필요가 없습니다. step1이 완료된 후 첫 번째 코드도 step2 코드를 실행하게하십시오. DoWork() 메서드를 직접 호출 할 수도 있습니다. –

답변

1

타사 라이브러리를 사용하여 작업 일정을 수락하면 Quartz.NET을 확인하고 여기에 설명 된 작업 수신기 메커니즘은 http://quartznet.sourceforge.net/tutorial/lesson_7.html입니다. 혼자서 구현하려는 경우 Chain of Responsibility으로 구성된 일련의 작업을 실행하는 단일 BackgroundWorker을 사용하면이 패턴에 대한 자세한 내용은 여기 http://dofactory.com/Patterns/PatternChain.aspx에서 확인할 수 있습니다.

4

대신 .NET 4.0 Task 클래스를 사용하고 Task.ContinueWith을 사용하여 더 많은 작업을 대기시킬 수 있습니다.

+0

불행히도 나는 .NET-3.5를 응용 프로그램이 실행될 컴퓨터에만 가지고 있습니다 ... –

3

두 개의 다른 BackgroundWorker 구성 요소를 사용하는 것이 가장 좋습니다. 첫 번째 이벤트 처리기의 RunWorkerCompleted 이벤트 처리기에서 두 번째 이벤트 처리기를 시작하십시오. 그것은 일을하는 매우 합리적인 방법처럼 보입니다. 단 하나의 BackgroundWorker으로 시도하지 마십시오.

Tudor mentioned으로는 Task을 사용할 수 있지만 친숙한 이벤트 지향 인터페이스, 진행보고 등을 통해 BackgroundWorker의 편의를 누릴 수 있습니다.

3

사용자의 설명에서 단계가 관련되어 있고 순차적이므로 하나의 BGW로 구현할 것입니다. 여기서 DoWork은 구문 분석 단계와 데이터베이스 단계에 쓰기 사이에 ReportProgress에 대한 호출로 두 단계를 수행합니다.

UI 스레드에서 실행되는 ProgressChanged 이벤트를 처리하여 작업자가 이미 데이터베이스에 쓰고 있음을 알면 완료된 구문 분석 단계 이후의 모든 논리를 수행 할 수 있습니다.

ReportProgress은 백그라운드 작업 및 선택적으로 사용자 지정 개체의 완료율을 식별하는 정수를 허용합니다. 그러므로 ProgressChanged 처리기에서이 진행 정보를 해석 할 논리가 필요합니다. 이 경우, 2 걸음 씩 일하는 것이므로 ReportProgress(50)으로 전화하면됩니다.

+0

ReportProgress는 정수를 허용하지 않습니다. 객체를 받아들이는 과부하는 풍부한 피드백을 제공하는데 도움이됩니다. –

+0

맞아, MSDN을 확인하고 과부하를 완전히 놓쳤다. 답변이 업데이트되었습니다. –

관련 문제