2011-09-18 3 views
2

서버 응용 프로그램을 작성하고 내 코드는 좀 .. 반복 .. 받아 봐지기 시작한다 : 나는 .NET 4.0을 사용하고다른 스레드에서 GUI 컨트롤을 업데이트 할 때 반복을 줄이는 방법은 무엇입니까?

private void AppendLog(string message) 
{ 
    if (txtLog.InvokeRequired) 
    { 
     txtLog.Invoke(new MethodInvoker(() => txtLog.AppendText(message + Environment.NewLine))); 
    } 
    else 
    { 
     txtLog.AppendText(message); 
    } 
} 

private void AddToClientsListBox(string clientIdentifier) 
{ 
    if (listUsers.InvokeRequired) 
    { 
     listUsers.Invoke(new MethodInvoker(() => listUsers.Items.Add(clientIdentifier))); 
    } 
    else 
    { 
     listUsers.Items.Add(clientIdentifier); 
    } 
} 

private void RemoveFromClientsListBox(string clientIdentifier) 
{ 
    if (listUsers.InvokeRequired) 
    { 
     listUsers.Invoke(new MethodInvoker(() => listUsers.Items.Remove(clientIdentifier))); 
    } 
    else 
    { 
     listUsers.Items.Remove(clientIdentifier); 
    } 
} 

. 아직 다른 스레드에서 GUI를 업데이트하는 더 좋은 방법이 있습니까? 그것이 다른 경우 내 서버에서 스레딩을 구현하기 위해 tasks을 사용하고 있습니다.

답변

3

당신은 다른 방법으로 반복 로직을 캡슐화 할 수 있습니다 : 당신과 같이 사용할 수 있습니다

public static void Invoke<T>(this T control, Action<T> action) 
    where T : Control { 
    if (control.InvokeRequired) { 
    control.Invoke(action, control); 
    } 
    else { 
    action(control); 
    } 
} 

가 :

listUsers.Invoke(c => c.Items.Remove(clientIdentifier)); 
+1

뿐만 아니라'호출은()'에 필요한 인수를 지정하여 호출 할 수 있습니다, 당신이 이미 당신의 대의원을 불러주세요. 'control.Invoke (action, control); ' –

+0

제프. 나는 그것이 다음 단계라고 말하고 싶다. 나는 단지 리팩토링을하고 있었다. ... –

+0

'control.Invoke (action, control);과'control.Invoke (new MethodInvoker (() => 액션 제어)))); –