다른 스레드에서 WPF 사용자 컨트롤을 만들 :내가 다른 스레드를 사용하여 일부 UserControl을 (들)을 만들려고하고, 나는 다음과 같은 코드를 사용하고
The calling thread must be STA, because many UI components require this.
이 작업을 수행하는 데 올바른 방법을 사용하고 있는지 확실하지 않습니다. 제발, 이걸 도와 줄 수있어?
감사합니다.
다른 스레드에서 WPF 사용자 컨트롤을 만들 :내가 다른 스레드를 사용하여 일부 UserControl을 (들)을 만들려고하고, 나는 다음과 같은 코드를 사용하고
The calling thread must be STA, because many UI components require this.
이 작업을 수행하는 데 올바른 방법을 사용하고 있는지 확실하지 않습니다. 제발, 이걸 도와 줄 수있어?
감사합니다.
비슷한 질문 - 당신은 발송자를 사용하여 UI 스레드에 어린이 컬렉션에 추가하는 컨트롤의 동작을 전달할 수 The calling thread must be STA, because many UI components require this
컨트롤 만들기는 모든 스레드에서 수행 할 수 있지만 GUI에 추가하는 작업은 주 스레드와 동기화해야합니다.
이 경우, 단 3 개의 컨트롤, Tasks를 잊어 버리고 직접 단일 스레드로 수행하십시오.
실제로 100 개의 컨트롤이 있으므로 멀티 스레딩을 찾고 있습니다. –
@Robin : 힘든 행운, 중요한 것들은 어쨌든 메인 스레드에서 수행되어야합니다. 작업 목록을 사용하여 컨트롤 목록을 준비하고 핸들이 필요하지 않은지 확인하십시오. –
고마워, 나는 이것을 시도했지만 예외는 여전히 존재한다! 실제로 다른 스레드에서 생성자를 호출하면 컨트롤이 창에 추가되지 않고 예외가 발생합니다. –
: 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 스레드에서 실행할 큐
이제는 모든 작업 (99.9 %)이 기본 스레드에 전달됩니다. 작업은 오버 헤드와 복잡성 만 생성합니다. –
@Henk Holterman - 제공된 코드가 단순 해졌고 루프에서 진행되는 다른 작업이있을 수 있습니다. 그렇지 않다면 여전히 컨트롤의 목록이 채워지는 동안 UI가 응답을 유지할 것입니다. 여기서는 멀티 스레딩의 모든 목적을 믿습니다. –
대기열에있는 모든 항목을 처리하기 전에 UI 스레드가 어떻게 응답 할 수 있습니까? –
+1 감사합니다. 문제 해결 방법을 알려줍니다 ... –