2012-11-04 2 views
3

내가 Invoke 내에서 몇 가지 방법이 크로스 스레드 응용 프로그램을 개발하고 있어요 호출단순화 윈폼 코드 크로스 스레드

if (this.InvokeRequired) 
{ 
    this.Invoke((Action)(() => 
    { 
     pbTotalProgress.Value = progress; 
     labe1.Text="SomeText"; 
    })); 
} 
else 
{ 
    pbTotalProgress.Value = progress; 
    labe1.Text="SomeText"; 
} 

가 어떻게 조금 아래 코드 짧은를 작성할 수?

답변

3

최소한 한 번만 동작을 정의해야합니다 (else 브랜치에서 코드를 다시 사용하지 않고 호출없이 해당 동작을 실행하십시오.)
다음과 같은 제어를위한 확장 메소드를 작성할 수도 있습니다. 필요한 경우 호출과 같은 작업을 실행하거나이를 실행합니다. 즉, 이벤트 핸들러에서 복잡성을 없애 것이다 당신이 당신의 응용 프로그램에서 많은 이벤트에 대해 동일한 패턴을 사용하게됩니다.

static class ControlExtensions 
{ 
    public static void InvokeOrExecute(this Control control, Action action) 
    { 
    if (control.InvokeRequired) 
    { 
     control.Invoke(action); 
    } 
    else 
    { 
     action(); 
    } 
    } 
} 

을 다음 각 스레드가 될 수있는 이벤트 :

Action setProgress = delegate() 
    { 
     pbTotalProgress.Value = progress; 
     labe1.Text = "SomeText"; 
    }; 
this.InvokeOrExecute(setProgress); 
+0

이것은 문자 그대로 복사하여 붙여 넣기가 쉽기 때문에 작동합니다. 이것은 진보뿐만 아니라 다양한 것들을 위해 사용될 수 있습니다. (예 : 직렬 포트에서 입력) 고마워요! – tim687

1

코드 블록이 동일하므로 Action 변수에 Invoke/실행 코드를 설정할 수 있습니다. 같은 것을보십시오 :

Action setProgress = delegate() { 
    pbTotalProgress.Value = progress; 
    labe1.Text = "SomeText"; 
}; 
if (this.InvokeRequired) { 
    this.Invoke(setProgress); 
} else { 
    setProgress(); 
} 

정확한 코드는 실제로 최적화가 필요하지 않습니다. 유일한 일은 부울 플래그 this.InvokeRequired에 대한 조건부 검사를 수행하는 것입니다. 무엇이든, 내 대답은 행동 코드를 복제하는 대신 한 번만 쓸 수있는 능력을 제공합니다.