2011-04-27 4 views
0

결함이있는 스레드의 흥미로운 패턴을 적시에 종료합니다. 이 패턴이 제품을 통해 반복적으로 발생하는 것을주의 깊게 관찰하십시오. 그것은을 기다립니다 실패 할 때 또는 SSL의 aswell에 WMI 연결 및 쿼리, 또는 데이터베이스 연결을 던지는 등빈약 한 패턴 셧다운 스레드 추적 (다시) 시작 스레드를 해결하는 방법

네트워크 클라이언트 연결을 질의 - 네트워크 연결 -

는 내결함성 과정을 말해봐 순간 (5 분을 말하게하십시오)을 시도한 다음 다시 연결하십시오.

가끔 이런 일이 발생하는 동안 네트워킹을 중지 할 수도 있습니다. 그러면 두 번째 스레드에서 신호가 중단되고 일부 시스템 종료가 있음을 알리는 메시지가 표시됩니다.

내결함성 프로세스가 대기중인 경우 다른 스레드가 관리하는 이벤트에서 대기하도록함으로써 쉽게 중지 할 수 있습니다.

시간이 오래 걸리고 비용이 많이 드는 프로세스이므로 연결 기능을 중간에 중단하는 방법은 무엇입니까? Cancel() 호출 후/도중 의 단계를 관리하는 방법은 현재 연결이 새로운 SslStream을 만드는 과정에서 취소/정리를 호출 할 수 있으므로 불완전한 상태로 연결 완료 - m_network가 새 객체로 설정 됨 .

private TcpClient m_network = new TcpClient(); 
private ManualResetEvent m_closing = new ManualResetEvent(true); 

private void Connect() 
{ 
    try 
    { 
     m_network.Connect(m_config.Address.Host, m_config.Address.Port); 

     SslStream sslStream = new SslStream(m_network.GetStream(), true, ValidateServerCertificate, ClientCertificateSelection); 

     X509CertificateCollection clientCertificates = GetClientCertificates(); 
     sslStream.AuthenticateAsClient(m_config.Address.Host, clientCertificates, SslProtocols.Default, false); 

     // do more stuff in a new thread 
    } 
    catch (System.Exception ex) 
    { Reset(); } 
} 

public void BeginExecution() 
{ 
    ThreadPool.QueueUserWorkItem(delegate 
    { 
     m_closing.Reset(); 
     Connect(); 
    }); 
} 

public void Cancel() 
{ 
    m_closing.Set(); 
    Cleanup(); 
} 

private void Cleanup() 
{ 
    TcpClient tempClient = m_network; 
    m_network = new TcpClient(); 
    if (tempClient.Connected) 
    { 
     tempClient.Close(); 
    } 
} 

void Reset(){ 
    if (m_closing.WaitOne(0)) 
     return; 

    Cleanup(); 

    if (m_closing.WaitOne(TimeSpan.FromSeconds(300))) 
     return; 

    ThreadPool.QueueUserWorkItem(delegate { Connect(); }); 
} 

연결 잠금을 사용하거나 로컬 네트워크 변수를 사용하면 초기에 차단을 시도하지 않는 목적을 상실합니다.

연결에서 각 작업 후에 이벤트를 계속 확인한 다음 정리를 호출하는 것은보기 싫은 것처럼 보입니다.

+0

여기에 F #을 사용할 기회가 있습니까? 비동기 CTP는 어떻습니까? – GregC

+0

질문에 대한보다 자세한 답변을 얻으려면 다시 태그를 달아보십시오. – GregC

+0

@GregC : 감사합니다. 비동기 CTP는 프레임 워크 2에서 사용할 수 없지만 흥미로운 것 같습니다. F #의 기회는 아직 없습니다. –

답변

1

C#의 비동기식 C# 또는 비동기식 CTP의 좋은 점은 취소 및 제한 시간 흐름을 외부화 할 수 있다는 것입니다. 꼭해야한다면 TPL과 계속해서 비슷한 일을 할 수 있습니다.

관련 문제