2012-01-25 3 views
1

나는 이것에 관해서 다른 질문이 있다는 것을 알고 있지만 대부분의 대답은 내가 제안하려고하는 것을하지 않는다. 그래서 나는 네가하기로되어 있지 않다는 것을 안다. 이 질문에 대한 이유는이다, .net의 기본 UI 스레드가 아닌 다른 스레드에서 UI를 실행하려면 어떻게해야합니까?

이의 나는 복잡한 응용 프로그램을 가정 해 봅시다 ... 내가 규칙을 중단 할 이유

다음

은, 내가 할 수있는 방법 ... 어쨌든 그것을 할 것입니다 버전 1을 사용하고 있으며 고객이 충돌 또는 중단 된 경우 고객에게 오류를 제출하기를 원합니다. 이제 보고서를 제출하기 위해 클릭하는 기본 폼 상단에 버튼이 있다고 가정 해 보겠습니다.

의 이제 응용 프로그램 때문에 교착 상태 걸려 있다고 가정 해 봅시다 ...

그 버튼에 대한 UI의 작은 조각과 핸들러가 메인 UI 스레드가 아닌 다른 스레드에서 살 수 있다면 좋을 것 때문에 그것은 교착 상태에 빠지지 않았다는 것입니다. 클릭하면 다른 스레드에 대한 모든 호출 스택을 수집하여 오류보고 서비스에 제출합니다.

이제 시나리오를 알면 .net에서이를 수행 할 수 있습니까?

+0

그럼 어떻게 크로스 스레드 예외를 방지하지만 다른 스레드에서 실행하는 질문입니까? –

+0

관리 스레드 스택을 수집하는 방법을 알고 싶습니다.필자가 지금까지 알고있는 유일한 해결책은 사용자가 작성한 작은 디버거를 구현하여 실행하고 앱에 연결 한 다음 스택을 덤프 한 다음 분리하고보고하고 죽을 수 있도록하는 것입니다. – antiduh

답변

5

예, "주 스레드"가 아닌 다른 스레드에서 UI를 만들 때 마술은 없습니다. 항상 명심해야 할 중요한 규칙은 UI를 만든 스레드에서 UI와 상호 작용하는 것입니다.

그래도 잘못된 각도에서 공격하고있는 것 같습니다. 대신에 모든 작업을 주 스레드에서 푸시 (push)하려고 노력해야합니다. 그렇게하면 스레드가 멈추는 위험을 최소화 할 수 있습니다. 그러면 오류보고를 위해 정통 솔루션을 사용할 필요가 없습니다.

+0

조언을 주셔서 감사합니다. 우리는 실제로 이미 다른 스레드에 많은 작업을했습니다. 이미지와 같은 리소스로 작업 할 때는 두 스레드가 동시에 사용할 수 없도록 모니터해야합니다. 그렇다면 교착 상태의 위험이 있으므로 여기에 어떻게 도착했는지 알 수 있습니다. –

+0

나는 여기에 백만 줄 이상의 코드를 언급해야한다 :-) –

+0

'이미지 같은 리소스로 작업 할 때 두 개의 스레드가 동시에 사용하려고하지 않도록 모니터링해야한다. 이미지에 대한 특별한 점은 무엇입니까? 이미지는 대부분의 다른 것들과 마찬가지로 객체 인스턴스입니다. –

0

응용 프로그램이 멈춘 경우 기본 메시지 루프가 작동하지 않으므로 ui가 작동하지 않습니다. 귀하의 문제에 대한 해결 방법으로 어떤 경우 든 수행해야하는 다른 스레드에서 UI를 호출하려는 경우

의 경우 호출 될 외부 응용 프로그램 (다른 exe) 사용을 고려할 것입니다. context switch winforms 따라, this answer

+0

내 시나리오에서는 주 UI 스레드가 교착 상태 인 경우 별도의 스레드에서 호출을 호출해도 해당 스레드가 중단됩니다. –

2

나는 메인이 아닌 스레드에서 양식을 만드는 다양한 경우가 있으며 매번 잘 작동합니다.

Thread을 새로 만들고 Form을 표시하십시오. 해당 스레드에 대해 새 메시지 루프가 만들어지고 모든 것이 잘 실행됩니다.

어떤 마술 당신이 추락 응용 프로그램에서 데이터를 수집하는 데 사용하는 메인 스레드를 고정합니다, 그건 당신에게 달렸어요 :)

0

그것은 당신이 다른 작업이 경우에도 살아 UI를 유지하고 싶습니다 같은 소리 교착 상태에 빠져 들었다. 그렇다면 아마도 Asynchronous Programming이 사용됩니다. 비동기를 사용하여 잠재적으로 중단 된 작업을 관리하면 응용 프로그램의 나머지 부분이 응답 할 수 있습니다.

우리는 우리의 고객이 충돌의 경우에 우리에게 오류를 제출하려고하거나 요구하지 않고이 데이터를해야합니다 있도록

당신은 또한, 계측 /보고하는 경우 어느 정도를 추가하는 것이 좋습니다 중단 사용자 입력.

+0

감사 마크, 비동기 프로그래밍은 (내가 .net 2.0 의존성을 가지고 있기 때문에) 스스로 할 일을위한 멋진 구문 일뿐입니다. 당신이 제안하는 것은 제가 쓰고있는 것과 그 질문의 이유입니다. –

+0

감사합니다 스티브; 당신이 2.0에 의존했다는 것을 알지 못했습니다. Async에 대한 좋은 점 중 일부는 코드 개발을 단순화하고 코드의 의도를보다 쉽게 ​​나타낼 수 있다는 것입니다. –

관련 문제