모든 처리가 완료된 후 Parallel.Invoke로 무거운 배경 작업을 실행하고 있습니다. 메소드를 반환하고, 다시 돌아와 계산 된 데이터를 활용하는 다음 메서드를 호출합니다. 오류 : 크로스 스레드 작업이 유효하지 않습니다. 제어가 '생성 된 스레드가 아닌 다른 스레드에서 액세스되었습니다.배경 작업을 parallel.Invoke로 실행 한 후 UI를 업데이트합니다.
하지만 처음에는 Parallel.Invoke에서 생성 한 스레드에서 이미 반환했습니다. 컨트롤이 시작된 스레드로 되돌아 가지 않는다는 것이 정상입니까? 그리고 이것이 어떻게되는지 확신 할 수 있습니까?
코드 :
public void TopMethod()
{
Calculate(4);
UpdateGui();
}
public void Calculate(int depth)
{
Recursive(depth);
}
public void Recursive(int depth)
{
if (depth > 0)
System.Threading.Tasks.Parallel.Invoke(
delegate { Recursive(depth - 1); });
}
public void UpdateGui()
{
CalculateOhter(); // Works fine.
controlElement.Focus(); // Causes exception
}
편집 : 나는 약 Control.Invoke 알고하지만이 못생긴 솔루션 (모든 컨트롤에 대리인을 저장하지 않으을) 될 프로그램은 모든 계산을 기다릴 필요 계속하기 전에 완료하십시오. 그래서 어떻게 든 컨트롤을 처음부터 함께 시작한 쓰레드로 되돌릴 수 있다면 더 좋을 것입니다.