2013-03-05 14 views
8

Basit bir asenkron TCP Server yazdım - iyi çalışıyor. Ancak şimdi Konsol Test Programında alınan verilerin bir çıktısını almak istiyorum. Ve sorun şu ki, bu çalışmıyor! MainThread'i EventHandler'a bağlarsam, program hiçbir şey yapmaz. Hata ayıklama sc05Server_DataAvailable çağrıldı ancak sonra hiçbir şey olmadı gösteriyor. Program hala duyarlı. İşte Kod Console.Writeline EventHandler

:

private void ReadCallback(IAsyncResult asyncResult) 
{ 
    Sc05BdClient sc05BdClient = asyncResult.AsyncState as Sc05BdClient; 
    if (sc05BdClient == null) return; 
    NetworkStream networkStream = sc05BdClient.NetworkStream; 
    int read = networkStream.EndRead(asyncResult); 

    if (read == 0) 
    { 
     lock (clients) 
     { 
      clients.Remove(sc05BdClient); 
      return; 
     } 
    } 

    string data = Encoding.GetString(sc05BdClient.Buffer, 0, read); 
    System.Diagnostics.Debug.Print(data); 
    OnDataAvailable(this, new DataAvailableEventArgs(data)); <---- here Handler is called 
    networkStream.BeginRead(sc05BdClient.Buffer, 0, sc05BdClient.Buffer.Length, ReadCallback, sc05BdClient); 
} 


public event EventHandler<DataAvailableEventArgs> DataAvailable; 

protected virtual void OnDataAvailable(object sender, DataAvailableEventArgs e) 
{ 
    EventHandler<DataAvailableEventArgs> handler = DataAvailable; 
    if (handler != null) 
     handler(sender, e); 
} 


public class DataAvailableEventArgs : EventArgs 
{ 
    public string Data; 

    public DataAvailableEventArgs(string data) 
    { 
     Data = data; 
    } 
} 

Ana programı:

class Program 
{ 
    static void Main() 
    { 
     Sc05BdServer sc05BdServer = new Sc05BdServer(IPAddress.Any, 2006); 
     sc05BdServer.DataAvailable += sc05BdServer_DataAvailable; 
     sc05BdServer.Start(); 

     Console.ReadKey(); 
     sc05BdServer.Stop(); 
    } 

    static void sc05BdServer_DataAvailable(object sender, DataAvailableEventArgs e) 
    { 
     Console.WriteLine(e.Data); <--- this is called once 
    } 
} 

Ben Threading ile ilgili bir şey olduğunu düşünüyorum - ama nasıl onlarla çalışmak hiçbir fikrim yok.

+0

Etkinliğinizin türünü kaydedebilir misiniz? Sc05BdServer içine bağlanan olay. –

+0

"if" durumuna girmediğinden ve geri dönmediğinden emin misiniz? Okuma bayt sayısı 0 olup olmadığını görmek için işleyicide bir kesme noktası yerleştirdiniz mi? –

+0

@JimMischel evet Eminim System.Diagnostics.Debug.Print'in çıktısını yapıyordur. – GreenEyedAndy

cevap

İlgili konular