2014-04-01 1 views
-1

winforms에서 messagebox에 문제가 있습니다. 메시지 상자가 표시 될 때 주 스레드가 멈추어 시스템에서 다른 오류가 발생하는 것으로 보입니다.WinForms MessageBox가 주 스레드를 붙입니다.

2 개의 시스템, 하나의 클라이언트 및 하나의 서버가 있습니다. 클라이언트는 GUI를 업데이트하고 다른 시스템의 이벤트를 수신하는 sevral 스레드를 가지고 있습니다. 메시지 상자가 메인 스레드를 사용하기 때문에 이러한 스레드는 GUI에 액세스 할 수 없으며 오류를 발생시킵니다.

메시지 상자에 주 스레드를 사용하지 못하게 할 방법이 있습니까?

+0

'그러면 시스템에 다른 오류가 발생합니다. 무엇입니까? 이것은 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) 인 것으로 보입니다. 그래서 더 나은 당신이 해결하려고하는 문제를 말할 수있다 –

+0

당신은 할 수 있지만, 정말로해서는 안됩니다. 귀하가 직면하고있는 실제 문제는 무엇입니까? – Crono

+0

2 개의 시스템, 하나의 클라이언트 및 하나의 서버가 있습니다. 클라이언트는 x 초마다 연결 유지 이벤트를 서버에 보냅니다.이 이벤트가 보내지지 않으면 오류가 로그에 기록됩니다. 메시지 상자가 표시되면 keep alive 이벤트가 전송되지 않고 5 초마다 오류가 로그에 표시되기 시작합니다 ... –

답변

1

생각을 바꾸어야합니다. 이 아니어야합니다. 이는 계속해서 메인 스레드를 사용해서는 안되는 MessageBox이 아닙니다. MessageBox은 요청을 전송하지 못하게하는 유일한 방법은 아니며 모든 모달 형식으로 인해 똑같은 문제가 발생할 수 있습니다.

여기 실제 해결책은 응용 프로그램의 디자인을 변경하여 기본 UI가 아닌 루핑 백그라운드 스레드에서 요청을 전송하는 것입니다. Thread.Sleep을 사용하여 요청을 합리적으로 시간 간격으로 유지하십시오. 이는 MessageBox.Show()에 대한 통화와 관계없이 계속 롤링됩니다.

어떤 식 으로든 해당 스레드에서 UI를 변경해야한다면 invocation methods 만 사용해야합니다.

+0

직장 동료와 대화를 나누면 다른 많은 스레드가 작동하는 것 같습니다. 배경. 그래서 문제는 여전히 메시지 상자입니다 ... –

+0

@LiranFridman 다른 스레드가 제안 된 솔루션을 적용하지 못하게하는 것이 확실하지 않습니까? 나는 항상 다른 스레드에서'MessageBox'를 호출하는 것이 거대한 개념상의 실수라고 생각합니다. 비록 그것이 당신의 즉각적인 문제를 해결할지라도, 그것은 완전히 새로운 도전에 대한 개방적인 문입니다. 여러 개의'MessageBox.Show()'호출은 다른 스레드에서 수행 될 수 있습니다. 대화 상자 사용자 입력을 주 스레드로 되 돌리면 더 어려워 질 것입니다. 당신이 해결하는 것보다 더 많은 문제를 만들 것이라고 믿습니다. 당연히 그것을하는 당신의 전화이다, 그러나 나는 그것을하지 않는 당신을 충분히 격려해서 좋다. – Crono

관련 문제