2010-01-12 7 views
0

백그라운드에서 작업을 수행 할 새 스레드를 생성하고 UI 작업을 수행하는 UI 스레드에서 실행되는 코드가 있다고 가정합니다. 백그라운드 작업이 완료되면 BeginInvoke가 새 스레드에서 호출됩니다. UI 작업이 계속 진행중인 경우 BeginInvoke에 주어진 콜백이 UI 작업을 중단합니까, 아니면 기다릴까요?UI 스레드에서 이미 실행중인 BeginInvoke 인터럽트 코드를 사용할 수 있습니까?

코드 예제 - 폼에 단추 1이라는 버튼을 추가하고 클릭 이벤트를 Button1_Click을 추가 한 다음 폼이 추가

bool continueWork = true; 

private void button1_Click(object sender, EventArgs e) 
{ 
    Thread workThread = new Thread(performBackgroundWork); 

    workThread.IsBackground = true; 
    workThread.SetApartmentState(ApartmentState.STA); 
    workThread.Start(); 

    for (long i = 0; i < long.MaxValue; i++) 
    { 
     if (!continueWork) 
      break; 

     button1.Text = i.ToString(); 
    } 
} 

private void performBackgroundWork() 
{ 
    Thread.Sleep(1); 
    button1.BeginInvoke(new MethodInvoker(stopUIWork));    
} 

private void stopUIWork() 
{ 
    continueWork = false; 
} 

는 클릭 한 후 단추 1의 텍스트가 무엇입니까?

답변

5

BeginInvoke는 대기열 (정확한 메시지 대기열)에 대리자를 추가합니다. 따라서 대답은 아니오, 중단되지 않습니다. 버튼 클릭 핸들러는 사실 메시지 대기열의 메시지로 인해 실제로 실행됩니다.

편집 : 죄송합니다. 두 번째 질문에 답변하는 것을 잊어 버렸지 만, 직접 해결할 수는 있습니다. 버튼 텍스트는 long.MaxValue - 1입니다. BeginInvoke를 사용하지 않고 stopUIWork을 실행하고 싶을 것입니다.

관련 문제