2010-07-08 7 views
17

좋아, 난 아주 간단 찾고 : 내 코드를 멈추지 않는 MessageBox를 만듭니다.코드를 중지하지 않는 MessageBox 만들기?

나는 다른 스레드 또는 뭔가를 만들어야 할 것 같니? 이를 수행하는 가장 좋은 방법을 조언하십시오.

감사합니다.

답변

9

아니요, 자신 만의 메시지 상자 양식을 만들어야합니다. MessageBox 클래스는 모달 연산 인 .ShowDialog()과 비슷한 동작 만 지원합니다.

매개 변수를 사용하는 새 양식을 만들고 스타일 시트 상자를 원하는 형식으로 작성하는 데 사용하십시오.


업데이트 나는 둘째을하고 싶습니다 구글을 통해이 발견 다른 사람에 대한 선명도를 유지의 정신에서

2014년 7월 31일이 설명하기 좀 더 :

후드 MessageBox에서

Windows SDK user32.dll MessageBox Function 주위에 멋진 C# 래퍼이며, 따라서 시스템 호출에 같은 일을 나타내는 정수로 .NET 열거 형을 변환 한 후 (정확히 같은 방식으로 동작합니다.

,

이것이 의미하는 바는 MessageBox.Show()에 전화 할 때 운영 체제에 호출이 마샬링되고 블록 옵션이 선택되거나 창이 죽을 때까지 현재 스레드를 차단한다는 것을 의미합니다. 당신이 별도의 스레드에서 메시지 상자를 시작해야하지만이 다시 메시지 상자에서 (예를 오는 어떤 결과가/없음/확인/취소 없다는 것을 의미합니다 중단되는 코드를 방지하기 위해/Etc ...)는 메시지 상자를 호출하도록 지정된 별도의 스레드로 리턴됩니다.

이 메시지 상자의 결과에 따라 행동하면 스레드 안전을 위해 UI 스레드로 결과를 다시 보내야합니다.

또는 WinForms/WPF에서 고유 한 메시지 상자 양식을 만들고 .Show() 메서드로 호출 할 수 있습니다. 버튼의 클릭 이벤트는 UI 스레드에서 실행되므로 UI ​​스레드를 다시 호출하여 UI 스레드를 조작 할 필요가 없습니다.

+0

잡았다. 그래서 나는 내 자신의 폼을 만들어야 만한다. 정말 고맙습니다. 감사합니다. – sooprise

+0

그래서 만약 내가'MessageBox.Show (MessageBoxButtons.확인 ')을 클릭하면 사용자가 확인 버튼을 클릭 할 때까지 프로그램이 일시 중지됩니까? 자동화 프로세스를 실행하고 처음 2 개의 프로세스가 완료되면 Messagebox를 통해 프로세스를 일시 중지 한 다음 사용자가 메시지 상자를 클릭하면 다음 자동화 프로세스가 실행됩니다. – HanH1113

+0

@ HanH1113 커버 안의'MessageBox.Show()'메쏘드는'.ShowDialog()'가하는 것과 같은 방식으로 효과적으로 실행됩니다. 블로킹 작업이므로 대화 상자가 닫힐 때까지 실행이 중단됩니다. 내 대답을 좀 더 명확하게 업데이트했습니다. – Aren

12

별도의 스레드에서 호출하여 다른 메시지 펌프를 회전시킬 수 있습니다. MessageBox.Show은 메시지를 펌프하므로 Application.Run을 호출하지 않아도 안전합니다.

public void ShowMessageBox() 
{ 
    var thread = new Thread(
    () => 
    { 
     MessageBox.Show(...); 
    }); 
    thread.Start(); 
} 

편집 :

나는 아마 내가이 일을하지 않는 것이 좋습니다 언급해야한다. 다른 문제가 발생할 수 있습니다. 예를 들어 메시지를 펌핑하는 두 개의 스레드가있는 경우 양식이 다른 사람이 메시지 상자를 닫기를 기다리는 경우 메시지 상자가 다른 양식 뒤에 걸릴 수 없습니다. 문제를 둘러싼 또 다른 방법을 찾아 내려고 노력해야합니다.

+0

'ThreadPool.QueueUserWorkItem (델리게이트 {MessageBox.Show ("Text");});':) – sunside

+2

@Markus : 좋은 일이 아닌'ThreadPool' 스레드를 끊는 것 외에는 속임수를 쓰겠습니다. 일반적으로 말하기 연습. –

+0

사실, 당신 말이 맞아요. – sunside