2009-05-21 6 views
0

저는 응용 프로그램과 외부 서비스 간의 연결을 관리하는 서버 응용 프로그램에서 구성 요소를 작성하고 있습니다. 내 구성 요소는 서버를 사용할 수 없을 때이를 감지하고 서비스가 사용 가능해질 때까지 백그라운드 스레드를 시작한 다음 "작동 중"상태로 다시 들어갑니다.신청 마감을 어떻게 감지합니까?

내 문제는이 스레드가 실행되는 동안 구성 요소를 호출하는 프로세스가 종료되면 스레드가 종료 될 때까지 응용 프로그램이 종료되지 않는다는 것입니다. 기본적으로이 서비스를 사용할 수 있으면 내 응용 프로그램을 종료 할 수 없습니다.

내 질문 : 거기에 어떤 백그라운드 스레드를 종료 할 수 있도록 응용 프로그램을 닫으려고하면 어떤 방법으로 감지 할 수 있습니까? AppDomain 클래스에서 몇 가지 이벤트를 발견했지만 어떤 조건에서 어떤 환경에서 해고 될지 잘 모르겠습니다.

낮은 수준의 구성 요소이므로 실행중인 환경에 대해 알 필요가 없으며 상위 수준의 구성 요소에서 종료되는 것을 알리고 싶지 않습니다.

이 구성 요소는 WCF 서비스와 Windows 서비스 응용 프로그램에서 모두 사용되며 WinForm 클라이언트 응용 프로그램에서도 테스트를 수행하고 있습니다.

답변

0

"이것은 낮은 수준의 구성 요소이므로 실행중인 환경에 대해 아무 것도 알기를 원하지 않으며 상위 수준의 구성 요소에서 종료되는 것을 알리고 싶지 않습니다."

이 두 가지 요구 사항은 서로 상충됩니다. 구성 요소가 응용 프로그램이 종료 될 때 (해당 응용 프로그램이 실행되는 환경에 대해 알고 있어야하는 경우) 또는 일부 상위 구성 요소 (환경에 대해 알고 있음)가 종료해야하는지 여부를 알 수 있어야합니다 종료합니다. 다른 옵션은 없습니다.

제 생각에 구성 요소는 사용 방법에 대해 가능한 한 적은 가정을해야합니다. 예를 들어, 응용 프로그램의 전체 수명 동안 사용되지만 응용 프로그램의 필요에 따라 언제든지 시작되고 중지 될 수 있다고 가정해서는 안됩니다. 구성 요소가 사용되는 유일한 방법은 응용 프로그램 수명 동안 발생한다고해도 이러한 접근 방법은보다 깨끗한 디자인으로 이어집니다. 따라서 올바른 방법은 응용 프로그램이 더 이상 필요하지 않을 때 구성 요소에 알려주는 것이고 응용 프로그램이 종료되는지 여부에 관계없이 자체적으로 종료해야한다고 말합니다. 또한 컴포넌트를 디자인 할 때 이것이 전형적인 접근법이라고 말할 수 있습니다.

1

하위 수준에서 작업을 처리해야하는 경우 응용 프로그램 닫기 이벤트 인 을 모니터링하려면 구성 요소가 필요할 수 있습니다. 이 코드는 종료 프로세스를 모니터링하는 데 사용됩니다. (누군가가 작업 관리자에서 최종 작업을 수행하는 경우에도 작동합니다.)

Process MyMonitoredProcess = null; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    Process[] p = Process.GetProcessesByName("processName", "machineName"); 
    if (p.Length > 0) 
    { 
     MyMonitoredProcess = p[0]; 
     MyMonitoredProcess.EnableRaisingEvents = true; 
     MyMonitoredProcess.Exited += TestProcessEndedEvent; 
    } 

} 

private void TestProcessEndedEvent(object sender, System.EventArgs e) 
{ 
    // Tasks to be done if application closes. 
} 

희망이 있습니다.

관련 문제