2012-02-29 3 views
0

C# .Net 4에는 backgroundworker_dowork() 이벤트가 있는데이 메서드는 세 가지 메서드를 호출하며 이들을 동기식으로 실행하려고합니다.BackgroundWorker에서 순차적 실행을 강제하는 방법

는 방법 (3) 방법이 후 실행해야 내 제약을 감안할 때, 및 방법이 비동기 적으로 실행되는 BackgroundWorker 모두 세 가지 방법으로, 1

그러나 방법 후 실행해야합니다.

어떻게 변경할 수 있습니까? SafeInvoke() 이후

private void bgwLoading_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ArrayList a = (ArrayList)e.Argument; 

    string[] fileNames = (string[])a[0]; 
    bool isLoad = (bool)a[1]; 

    this.loadMultiImages(fileNames, isLoad); 
} 

private void loadMultiImages(string[] fileNames, bool isLoad) 
{ 
    // I want to execute the following codes sequentially. 
    Bitmap newBtmap = saveJpeg(); 
    this.SafeInvoke(d => d.imageList.Images.Add(newBtmap)); 
} 

그것은 I 원하는 실행의 흐름을 변경하는 일 saveJpeg() 전에 실행 시작 saveJpeg()보다 시간이 덜 걸린다.

+0

매우 오도 된 제목입니다. 스레드 우선 순위는 완전히 다른 개념입니다. – Tudor

+0

동기 실행을 원하면 왜 비동기 실행을 사용합니까? –

+0

saveJpeg에서 "완료"하지 않고 SafeInvoke를 호출하도록 반환하는 이유는 무엇입니까? –

답변

0

이와 같은 것이 필요할 수 있습니다. 배경 작업이 완료된 후 메서드를 호출 RunWorkerCompleted 이벤트를 사용

var bg1 = new System.ComponentModel.BackgroundWorker(); 
var bg2 = new System.ComponentModel.BackgroundWorker(); 
var bg3 = new System.ComponentModel.BackgroundWorker(); 
bg1.RunWorkerCompleted += (s, e) => 
{ 
    bg2.RunWorkerAsync(); 
}; 
bg2.RunWorkerCompleted += (s, e) => 
{ 
    bg3.RunWorkerAsync(); 
}; 
bg1.RunWorkerAsync(); 

하지만, 나는이 패턴의 효과에 확실하지 않다. 동 기적으로 호출되는 함수를 원하면 동 기적으로 호출하십시오. 백그라운드 작업자를 사용하는 것보다 더 나은 방법이있을 수 있습니다.

당신이 백그라운드에서 동 기적으로 3 프로 시저를 실행 단지 백그라운드 스레드에서 동 기적으로 그들을 호출 할 경우

:

var bg1 = new System.ComponentModel.BackgroundWorker(); 
bg1.DoWork += (s, e) => 
{ 
    Process1(); 
    Process2(); 
    Process3(); 
}; 
bg1.RunWorkerAsync(); 
2

방법 3 방법 2에 따라 달라집니다 및 방법 (2) 다음이 방법 1, 에 의존하는 경우 실행하는 유일한 방법은 : 입니다. 두 스레드를 실행하여 작업을 수행하더라도 은 여전히 ​​에 메서드를 1-> 2-> 3으로 실행해야합니다.

여러 가지 방법을 사용하여 메소드 1과 메소드 3이 메소드 2를 기다릴 수 있지만 강제로 메소드를 동 기적으로 실행하므로 모든 스레드를 실행하는 데 1 개의 스레드 만 사용할 수 있습니다. 행동 양식.

관련 문제