결함이있는 스레드의 흥미로운 패턴을 적시에 종료합니다. 이 패턴이 제품을 통해 반복적으로 발생하는 것을주의 깊게 관찰하십시오. 그것은을 기다립니다 실패 할 때 또는 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(); });
}
연결 잠금을 사용하거나 로컬 네트워크 변수를 사용하면 초기에 차단을 시도하지 않는 목적을 상실합니다.
연결에서 각 작업 후에 이벤트를 계속 확인한 다음 정리를 호출하는 것은보기 싫은 것처럼 보입니다.
여기에 F #을 사용할 기회가 있습니까? 비동기 CTP는 어떻습니까? – GregC
질문에 대한보다 자세한 답변을 얻으려면 다시 태그를 달아보십시오. – GregC
@GregC : 감사합니다. 비동기 CTP는 프레임 워크 2에서 사용할 수 없지만 흥미로운 것 같습니다. F #의 기회는 아직 없습니다. –