2009-04-24 11 views
1

비동기 소켓 입력 상태를보고하는 데 사용되므로 스레드로부터 안전해야하는 Toast를 작성하고 있습니다. 스레드로부터 안전하게 만들려고했지만 토스트는 여전히 잠겨 있습니다.스레드 안전 Form.Show

public static void Show(string message) { 
     Toast toast = new Toast(message); 
     toast.ShowAction(); 
    } 

    private delegate void InvokeCallback(); 

    public void ShowAction() { 
     if (InvokeRequired) { 
      Invoke(new InvokeCallback(ShowAction)); 
     } 
     else { 
      Show(); 
     } 
    } 

나는 메시지 상자처럼 쉽게 즉 Toast.Show("Status changed"); 그들을 표시 할 수 있어야합니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

1

Toast이 (가) 다른 스레드에서 생성된다는 사실이 사용자의 문제입니다. 당신이해야 할 일은 메인 UI 스레드에서 "목표"를 가지고, Invoke()을 생성하고 Toast을 보여 주면서 모든 UI를 같은 스레드에 유지하는 것입니다.

편집

다른 스레드에서이 작업을 계속 할 수 있도록해야하는 경우, 귀하의 유일한 옵션은 메시지 루프와 다른 스레드를 만드는 것입니다.

Thread t = new Thread(); 

t.SetApartmentState(ApartmentState.STA) // Required for a UI thread 

이 스레드에 작업 및 메시지를 전달하는 구현에 관해서는 말씀 드리겠습니다. 메시지 루프를 시작하려면 시작시 Application.Run()으로 전화해야합니다.

그리고 항상 그렇듯이 기본 UI 스레드와 상호 작용할 수있는 토스트 (또는이 스레드의 모든 것)의 모든 작업을 Invoke()에해야합니다.

+0

폼을 만드는 동일한 스레드에서 폼 주위에 메시지 루프를 실행할 수 있습니다. 간단히 말하면 : Application.Run (form); 양식이 현재 제어 가능하므로 적절할 때 양식을 닫아야합니다. –

+0

@lassevk : NO NO NO! 시작하지 않은 스레드에서 메시지 루프를 시작하지 마십시오. 이것은 재앙적인 결과를 초래할 수 있습니다! –