2009-10-30 6 views
1

다음 메서드는 UserControl 생성자에서 시작됩니다. 크로스 스레드 예외가 발생하지만 이유를 알 수 없습니다.예기치 않은 크로스 스레드 예외

public override void Populate() 
{ 
    base.Populate(); 
    LoadEditableList(IEditableList); 

    ThreadStart fix = null; 
    fix = delegate() 
    { 
    if (InvokeRequired) 
    { 
    Invoke(fix); 
    } 
    else 
    { 
    buttonAdd_Click(null, null); 
    } 
    }; 
    var thread = new Thread(fix); 
    thread.Start(); 
} 

buttonAdd_Click 메서드는 ListView에 항목을 추가합니다. 이상하게도, 만약 내가 브레이크 포인트를 if (InvokeRequired) 라인에 추가하면이 에러를 피할 수있다. 이것은 내가 수십 번 썼던 패턴과 매우 흡사합니다. 나는 새로운 아기 수면 증후군으로 인해 뭔가를 놓치고 있다고 생각합니다.

답변

2

InvokeRequired은 Windows 핸들이 생성 될 때까지 적절한 값을 반환하지 않는다고 생각합니다. 당신의 생성자에서 이것이 어디에서 호출되는 것입니까? 이 같은 첫 Control.Handle를 호출하면 그냥 테스트

: 당신의 Populate 방법의 상단에

IntPtr handle = Handle; 

, 그 도움을합니까? 나는 그것을 영구적 인 수정으로 제안하지는 않지만, 디버거에 침입했다면 작동하는 것으로 보완 할 것입니다. 이것은 Handle 속성에 액세스 할 것이므로 핸들을 생성하도록 강제 할 것입니다 ...

부모 창을 담당하는 스레드와 비교하여이 생성자가 실행되는 스레드는 무엇입니까? 특정 윈도우의 모든 컨트롤은 동일한 UI 스레드를 사용해야합니다.

+0

나는 당신이 옳다고 생각합니다. populate 메서드를 VisibleChanged 이벤트에 묶음으로써이 문제를 해결했습니다. 감사. –

1

알려진 문제가있을 수 있습니다. 자세한 내용은 here, herehere을 참조하십시오.