2011-01-19 4 views
1

처리되지 않은 예외를 지원하지 않는 멀티 스레드 Windows 서비스 (C#, .NET)를 상속 받았습니다. 이 서비스는 여러 스레드를 사용하여 분석을 위해 원격 측정 장치에서 데이터를 수집합니다. 이 서비스의 스레드는 24 시간 이상 실행할 수 있습니다. 스레드가 문제가 발생하여 재활용해야하는 주 스레드를 알려주는 방법에 어려움을 겪고 있습니다.스레딩 : C#을 사용하여 .NET Windows 서비스의 주 스레드에 콜백

class Program 
{ 
    static void Main(string[] args) 
    { 
    var workerObject = new WorkerObject(); 
    var workerThread = new Thread(workerObject.DoWork); 
    workerThread.Start() 
    } 
} 

class WorkerObject 
{ 
    //todo: My fields and properties go here 

    public void DoWork() 
    { 
    const int timeout = 100; 

    //todo: setup wait handles here 

    try 
    { 
     //Start monitoring channels for this device 
     while (true) 
     { 
     // Wait on any waithandle or timeout once per decisecond. 
     int channelIndex = WaitHandle.WaitAny(waitHandles, timeout, false); 

     //todo: process incoming data for this channel 
     } 
    } 
    //Catch all exceptions so we can notify mommy that we're in a bad way 
    catch (Exception ex) 
    { 
     //todo: log anything that can help us figure this problem out 

     //How do I tell the main thread I've failed 
    } 
    finally 
    { 
     //But of course we want to clean up after ourselves 
    } 
    } 
} 

사용이 심지어 최고의 .NET 스레딩 메커니즘은 다음과 같습니다 여기에 코드의 단순화 된보기입니까? Async Delegates 또는 Task Parallel Library를 대신 사용해야합니까?

답변

2

나는 최근에 비슷한 요구 사항을 가지고있었습니다. 나는 그들이 나쁜 때 부모에게 말하는 자식 스레드에 의존 할 수 있다고 생각하지 않습니다. 무한 루프에 걸리거나 어떤 이유로 교착 상태에 빠지면 어떻게 될까요? 나는 '감시견'접근법에 정착했다. 자식 스레드 각각은 '하트 비트'를 다시 메인 스레드로 보내야했습니다. 이 신호가 수신되지 않으면 스레드가 '죽었다'고 가정하고 조치를 취할 수 있습니다. 저는 여기에 정착 아키텍처에 대한 게시물은 다음과 같습니다이 도움이

http://blog.bobcravens.com/2009/08/monitored-watchdog-asynchronous-process-in-c/

희망. 밥

+0

젠장, 코드에 souce 링크를 추가 할 수 있습니까 ??? 어떤 것을 이해하는 것은 불가능합니다. – IamStalker

0

다니엘 엄 멀티 스레딩과에 대해 많이 블로그에있다

는 최근 병렬 작업은 .NET 4.0에서 지원합니다. 훌륭한 리소스 인 http://www.danielmoth.com과 매우 흥미 롭습니다. 나는 확실히 그것을 체크 할 것이다.

이 방법이 도움이되는지 확신 할 수는 없지만 큐에서 작업을 가져 와서 ThreadPool에서 작업을 예약하는 "Report Runner"Windows 서비스에서 작업했습니다. "Report"가 실패하면 오류를 로그하고 함수를 종료하고 ThreadPool에서 예약되었으므로 더 많은 보고서를 실행하기 위해 풀로 반환됩니다. ThreadPool을 사용하면 실행중인 코드가 실패 할 경우 새 스레드 회전을 관리하는 데 필요한 코드가 필요하지 않습니다.

관련 문제