2014-04-17 3 views
3

나는 창 핸들이 만들어 질 때까지 호출 또는 BeginInvoke는 컨트롤을 호출 할 수 없습니다 다음과 같은 런타임 오류 메시지어떻게 C#

을 얻고에서 핸들의 WinForm의 생성을 강제 않습니다.

여기 내가 계속하고 있다고 생각합니다. 내 winform 생성자가 비동기 TCP/IP 데이터를받은 객체를 만드는 중입니다. 짧은 이야기를하기 위해 네트워크 데이터를받는 클래스가 텍스트 상자에 데이터를 인쇄하기 위해 Winform에서 루틴을 호출 할 수있게하는 이벤트 대리자가 있습니다. 이것은 내가받은 것을 볼 수있게 해줍니다. 데이터가 즉시 수신되는 것을 볼 수 있습니다. 이것은 winform 생성자가 끝나기 전에 발생합니다.

나는 핸들이 생성 될 때까지 winform 또는 winform 구성 요소를 읽을 수 없습니다. 나는 이것이 내가 위반하는 것으로 의심한다. 이 기능을 강요하는 기능이 있다고 가정합니다. TCP/IP 데이터를받는 클래스를 만들기 전에 강제로 만들기 위해 winform 생성자에 다음 코드를 추가해 보았습니다. 그러나 오류가 남아 있습니다. 그러나 나는 객체 핸들 생성을 확인하고 그 경우에 전화를 피하는 방법이 내가 실현

public void Print_Console_Message(string message) 
    { 
     Console_Output.Enqueue(message); 
     this.Invoke(new EventHandler(PrintToConsole)); 
    } 
    private void PrintToConsole(object sender, EventArgs e) 
    { 
     string message = Console_Output.Dequeue(); 

     if (message.Length != 0) 
     { 
      HistoryBox.AppendText(message + "\n" + "\n"); 
     } 
    } 

: 여기

InitializeComponent(); 
this.CreateControl(); 
this.HistoryBox.CreateControl(); 

은 도움이 경우 제의 WinForm 대리인 코드입니다 단순히 출력의 일부를 억제하는 데 관심이 없습니다.

누구나 생성자가 끝나기 전에 대리자 함수를 호출 할 수 있도록 핸들 또는 컨트롤 만들기를 강제 할 수있는 방법을 알고 있습니까?

+0

호출을 필요로하는 개체의 생성을 ['Load'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.load%28v)로 옮길 수 있습니까? = vs.110 % 29.aspx) 이벤트 대신 생성자가 필요합니까? 'Load' 이벤트는 핸들이 생성 된 후에 발생하며 이와 같은 상황에 좋습니다. –

답변

7

documentation에 따르면 .Handle 속성을 사용하면이 작업을 수행 할 수 있습니다.

핸들이 아직 만들어지지 않은 경우이 속성을 참조하면 핸들이 만들어집니다.

또는 HandleCreated 이벤트를 청취하고 해고 된 후 Invoke 만 청취 할 수 있습니다.

+0

그 트릭을 했어. '(this.Handle! = null && this.HistoryBox.Handle! = null && this.Error_Output! = null && this.Dev_Output_Window! = null) {}' –

+2

' .Handle' 속성은 uiElement.InvokeRequired == true이면'InvalidOperationException'을 던집니다. uiElement.CreateControl()을 사용하는 것이 더 좋습니다. 방법. 코드 수정에는 무관심합니다. – it3xl

+0

'InvokeRequired'가'true'라면 메소드를 호출 할 때 같은 예외가 발생할 것으로 예상됩니다. 'CreateControl()'은 조금 더 잘 읽지 만 핸들을 생성 할 수있는 것은 아닙니다. – MrBlue