2014-11-01 2 views
-1

텍스트를 텍스트 상자에 쓰고 싶습니다. 다른 스레드에서이를 수행 할 수 있도록 invoke 및 textbox-writing을 보유하는 unstatic 메서드를 호출하는 정적 메서드를 호출합니다. 이럴 때. 창 핸들이 설정 될 때까지 호출 할 수 없다는 오류가 발생하므로 설정하고 있습니다. 단지 BeginInvoke 코드가 아니라 실제로 텍스트 설정 내 문제는 코드에서 아래루핑/크래싱 호출

if (!this.IsHandleCreated) 
    this.CreateHandle(); 

의 위치가 내 프로그램이 충돌하지 않는 유일한 사람이라고,하지만 지금은 (indefinetly) 루핑 것 아래 코드를 참조하십시오. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

코드 : txtServerLog가 true로 InvokeRequired 때마다, 당신이를 호출하고, 때문에

내 스레드에서
private void ActualLog(string input) 
     { 
      var currentForm = form as Main; 

      if (!this.IsHandleCreated) 
       this.CreateHandle(); 
      if (currentForm.txtServerLog.InvokeRequired) 
      { 
       this.BeginInvoke(new Action<string>(ActualLog), new object[] { input }); 
       return; 
      } 
      else 
      { 
       currentForm.txtServerLog.Text += input + "\r\n"; 
       currentForm.txtServerLog.Refresh(); 
      } 
     } 

     public static void Log(string input) 
     { 
      Main main = new Main(); 
      main.ActualLog(input); 
     } 

, 나는 지금까지 내가 말할 수있는 Log("Any String");

답변

1

를 부를 것이다, 당신의 무한 루프입니다 ActualLog를 작업으로 보낸 작업. 본질적으로, 당신이 그 조건부 경로에 올 때마다, 당신은 ActualLog로부터 다시 시작하고 있습니다. 이 방법에서 다른 모든 코드를 가져다가 바로이 있다면 상상 :

private void ActualLog(string input) 
{ 
     ActualLog(input); 
} 

내가 여기에 몇 가지 주름을 누락 될 수 있습니다,하지만 난 당신이 무슨 일을하는지 그게 정확히 확신 해요. txtServerLog를 사용하여 명령을 호출해야하는 경우에는 상태를 변경하기 위해 아무 것도하지 않으면 명령을 반복 할 수 있습니다.

실제로 수행하려고하는 기능을 별도의 로그로 분리하면됩니다. 목표가 TextBox를 업데이트하는 것으로 가정하고 있습니다.

그래서, 예 :

private void UpdateTextBox(string input) 
{ 
    currentForm.txtServerLog.Text += input + "\r\n"; 
    currentForm.txtServerLog.Refresh(); 
} 

하고 ActualLog 기능 :

private void ActualLog(string input) 
{ 
    var currentForm = form as Main; 

    if (!this.IsHandleCreated) 
    { 
     this.CreateHandle(); 
    } 
    if (currentForm.txtServerLog.InvokeRequired) 
    { 
     this.Invoke(new Action<string>(UpdateTextBox), new object[] { input }); //Make sure to use Invoke, not BeginInvoke 
     return; 
    } 

    UpdateTextBox(input); 
} 

가 명심 당신이 경우 조건에 반환하고 경우 다른-이없는 경우, else 브랜치를 가질만한 기능적인 이유가 없습니다. if 블록 뒤에 그냥 포함시킬 수 있습니다.

지나가는 코드에 관한 요점 - 실제로 그 안에 Log()를 호출하지 않아서 왜 그 코드가 있는지 또는 문제와 관련이 있는지 확실하지 않습니다.

+1

@JanH. 100 % 확신 할 수는 없지만 위의 샘플을 포함 시켰습니다. – furkle

+0

고마워요! 귀하의 예제에서 BeginInvoke 대신 Invoke를 사용하면 작동합니다. 두 함수가있는 것은 단지 Annot Thread에서 Log()를 호출 할 수 있었기 때문에 Invoke는 정적 함수에서 허용되지 않았으므로 (그래서 나는 그것을 정적이 아닌 정적 변수에 넣고 정적 변수에서 호출 함). 하지만 어쨌든 고마워요 :) –

+0

@JanH. 아, WPForm에서 WinForms보다 많은 시간을 보냅니다. Invoke/BeginInvoke 구별에 조금 녹슬 었습니다. 그것을 듣고 다행 도움이! – furkle