2011-02-03 2 views

답변

3

컨트롤 만들기는 모든 스레드에서 수행 할 수 있지만 GUI에 추가하는 작업은 주 스레드와 동기화해야합니다.

이 경우, 단 3 개의 컨트롤, Tasks를 잊어 버리고 직접 단일 스레드로 수행하십시오.

+0

실제로 100 개의 컨트롤이 있으므로 멀티 스레딩을 찾고 있습니다. –

+0

@Robin : 힘든 행운, 중요한 것들은 어쨌든 메인 스레드에서 수행되어야합니다. 작업 목록을 사용하여 컨트롤 목록을 준비하고 핸들이 필요하지 않은지 확인하십시오. –

+0

고마워, 나는 이것을 시도했지만 예외는 여전히 존재한다! 실제로 다른 스레드에서 생성자를 호출하면 컨트롤이 창에 추가되지 않고 예외가 발생합니다. –

1

: BeginInvoke는 디스패처에 당신은 기본적으로 작업을 추가 호출하여

private void btnDemo_Click(object sender, RoutedEventArgs e) 
{ 
    Task tsk = Task.Factory.StartNew(() => 
    { 
    for (int i = 0; i < 3; i++) 
    { 
     Dispatcher.BeginInvoke(new Action(() => { 
     MyControl sprite = new MyControl(); 
     pnlTest.Children.Add(sprite); 
     })); 
    } 
    }); 
} 

을 UI 스레드에서 실행할 큐

+0

이제는 모든 작업 (99.9 %)이 기본 스레드에 전달됩니다. 작업은 오버 헤드와 복잡성 만 생성합니다. –

+0

@Henk Holterman - 제공된 코드가 단순 해졌고 루프에서 진행되는 다른 작업이있을 수 있습니다. 그렇지 않다면 여전히 컨트롤의 목록이 채워지는 동안 UI가 응답을 유지할 것입니다. 여기서는 멀티 스레딩의 모든 목적을 믿습니다. –

+0

대기열에있는 모든 항목을 처리하기 전에 UI 스레드가 어떻게 응답 할 수 있습니까? –

관련 문제