SORU
13 Aralık 2008, CUMARTESİ


Durdurmak için TcpListener uygun şekilde

Şu anda TcpListener her iletişimden sonra tek bağlantısı kapatma için bir konu verilir, gelen bağlantılar, adresi kullanıyorum. Kod aşağıdaki gibi görünüyor

TcpListener listener = new TcpListener(IPAddress.Any, Port);
System.Console.WriteLine("Server Initialized, listening for incoming connections");
listener.Start();
while (listen)
{
     // Step 0: Client connection
     TcpClient client = listener.AcceptTcpClient();
     Thread clientThread = new Thread(new ParameterizedThreadStart(HandleConnection));
     clientThread.Start(client.GetStream());
     client.Close();
}

listen değişken sınıfı üzerine bir alan olan boolean. Program kapatıldığında şimdi, müşteriler için dinleme durdurmak istiyorum. false dinle ayarı daha fazla bağlantı alarak önlemek olacaktır, ama AcceptTcpClient engelleme arama olduğundan, en az bir sonraki Müşteri alın ve çıkın. Sadece patlak ve sonra durdurmak için zorlamak için herhangi bir yolu var mı? Ne etkisi dinleyici arama yapar.() Dur diğer engelleme çağrısı çalışırken?

CEVAP
13 Aralık 2008, CUMARTESİ


Kodu verilen yapardım 2 öneri var ve sanırım ne tasarım. Ancak gerçekten ağ veya dosya sistemi gibi I/O ile çalışırken, engellenmeyen I/O geri kullanmanız gereken ilk işaret etmek istiyorum. UzakFARdaha verimli ve uygulama programı yapmak zor olsa da çok daha iyi çalışacaktır. Kısa bir süre sonunda önerilen bir tasarım değişikliği ele alacağız.

  1. Kullanarak(){} TcpClient için
  2. İplik.() İptal
  3. TcpListener.() Bekleyen
  4. Yeniden ayarlayın

Kullanarak(){} TcpClient için

*Gerçekten bir TcpClient kullanarak aramanızı almanız gerektiğini unutmayın(){} bloğu bu TcpClient sağlamak için.() Elden veya TcpClient.() Kapalı yöntemler bile bir istisna durumunda denir. Alternatif olarak, bir try finally bloğunda bu koyabilirsiniz {} finally {} bloku.

İplik.() İptal

Yapabileceğin gördüğüm 2 şey var. 1 Eğer başka bir yerden bu TcpListener iplik başlamışsa sadece İplik arayabilirsiniz.Bir threadabortexception engelleme çağrısı içinde atılmasına neden ve yığın yürüme erecek olan iş parçacığında örnek yöntem iptal.

TcpListener.() Bekleyen

İkinci düşük maliyetli düzeltme dinleyici kullanmak olacaktır.() Bekleyen yöntem yoklama modeli kurmak için. Daha sonra bir iş Parçacığı kullanır.""Eğer yeni bir bağlantı bekliyor. görmeden beklemek uyku Bekleyen bir bağlantısı var bir kere AcceptTcpClient arayacağını ve bekleyen bağlantı bırakın. Kod şöyle görünecektir.

while (listen){
     // Step 0: Client connection
     if (!listener.Pending())
     {
          Thread.Sleep(500); // choose a number (in milliseconds) that makes sense
          continue; // skip to next iteration of loop
     }

     TcpClient client = listener.AcceptTcpClient();
     Thread clientThread = new Thread(new ParameterizedThreadStart(HandleConnection));
     clientThread.Start(client.GetStream());
     client.Close();
}

Yeniden Ayarlayın

Sonunda gerçekten uygulamanız için engellenmeyen bir yöntem için hareket tavsiye ederim. Bu çerçeve Çakışan kullanır yorganın altına G/Ç tamamlama bağlantı noktaları ve engellenmeyen zaman uyumsuz aramalar gelen I/O uygulamak için G/Ç. Çok zor da değil, sadece senin kod biraz farklı düşünmeyi gerektirir.

Temelde BeginAcceptTcpClient yöntemi ile kod başlatmak ve takip dönersiniz IAsyncResult yapacaktın. Bir yöntem kimin sorumlu TcpClient alma ve atma zamanı bu bir işaretDEĞİLyeni bir iş parçacığı, ancak iş parçacığı Havuzu iş parçacığı için.QueueUserWorkerİtem değilsin yani iplik ve kapanış yeni bir iş parçacığı için her istemci isteği (Not gerekebilir kullanmak için kendi iş parçacığı havuzu varsa, özellikle uzun ömürlü istekleri nedeniyle iş parçacığı havuzu ortak ve eğer tekeline bütün konuları diğer parçaları uygulama tarafından uygulanan sistem olabilir aç). Dinleyici yöntemi kendi Havuzu istemek için yeni TcpClient başladı sonra BeginAcceptTcpClient tekrar çağırır ve kendisi de geri temsilci işaret eder.

Etkili sadece daha sonra çeşitli bölgelerinde adlı 3 farklı yöntemleri içine geçerli yöntem kesiliyor. 1. , 2 herşeyi bootstrap. hedef EndAcceptTcpClient aramak için, kendi iplik TcpClient başlaması ve kendini tekrar Ara, 3. istemci isteği işlemek için ve işiniz bittiğinde kapatın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • joshsnice

    joshsnice

    28 Kasım 2006
  • taliajoy18

    taliajoy18

    12 Temmuz 2011