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.
Etkinliğinizin türünü kaydedebilir misiniz? Sc05BdServer içine bağlanan olay. –
"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? –
@JimMischel evet Eminim System.Diagnostics.Debug.Print'in çıktısını yapıyordur. – GreenEyedAndy