2013-10-20 2 views
2

스레딩을 사용하려고하는데 GUI 컨트롤러가 포함되어 있으므로 해당 컨트롤러를 호출해야하지만이 문제가 있습니다.이 코드 부분에서 비 대리자 형식을 호출 할 수 없습니다 이 반면에 작업하는 동안비 대리자 형식을 호출 할 수 없습니다

if (toolStripTextBox1.Text != "") 
{ 
    if (RT[j].tabvalue.ToString() == tabControl1.Invoke(() => 
             { tabControl1.SelectedTab.Name; })) 
    { 
     RT[j].RitchT.Text = getH.getHtmlCode(toolStripTextBox1.Text); 
    } 
} 

tabControl1.Invoke(
    () => { tabControl1.TabPages[R.RitchT.Name].Controls.Add(R.RitchT); 
}); 

이것은 호출 클래스

public static class ControlExtensions 
{ 
    public static void Invoke(this Control control, Action action) 
    { 
     if (control.InvokeRequired) 
      control.Invoke(new MethodInvoker(action), null); 
     else 
      action.Invoke(); 
    } 
} 
에게 있습니다

어떻게 해결할 수 있습니까?

+0

이 줄에서 달성하고자하는 것 -'tabControl1.SelectedTab.Name'? –

+0

그냥 탭 이름을 반환하고 그것을 사용하여 if 문에서 무언가를 검사합니다. –

+0

컴파일되지 않습니다. 해답 대신 Hans Passant가 지정한대로'Func '을 사용해야합니다. –

답변

3
tabControl1.Invoke(() => { tabControl1.SelectedTab.Name; }) 

예, 법적 구문이 아닙니다. Control.BeginInvoke() 메서드는 첫 번째 인수로 대리자를 사용합니다. 람다 식은 암시 적으로 대리인으로 변환되지 않습니다. 도움을 받아야합니다. 수정 :

tabControl1.Invoke(new Func<string>(() => { return tabControl1.SelectedTab.Name; })) 

당신은 더 많은 문제를해야합니다, 당신은 작업자 스레드의를 RichTextBox의 Text 속성을 할당 할 수 없습니다, 당신은뿐만 아니라이) BeginInvoke를 (사용해야합니다. Text 속성을 읽지는 않겠지 만 작업자 스레드가 실행 중이고 사용자가 UI를 계속 조작하는 동안 바뀔 수 있습니다. BackgroundWorker 또는 Task를 선호하고, 작업을 시작하기 전에 필요한 데이터를 수집하고 작업이 완료된 후 UI 결과를 업데이트해야합니다.

+0

또한 메서드 본문을 위임하는 것이 잘못되었습니다. 어느 쪽도 컴파일하지 않습니다. –

+0

감사합니다 v 많은 일을 벌금 .. 그리고 나는 문제가 UR에 대해 지금 얘기하고있다. 나는이 주제에 대해 더 많은 것을 시도하고 다시 읽도록 노력할 것이다. –

관련 문제