2013-03-05 7 views
8

से राइटलाइन मैंने एक साधारण एसिंक टीसीपी-सर्वर लिखा है - यह अच्छी तरह से काम करता है। लेकिन अब मैं कंसोल-टेस्टप्रोग्राम पर प्राप्त डेटा का आउटपुट बनाना चाहता हूं। और समस्या यह है कि यह काम नहीं कर रहा है! यदि मैं मेन थ्रेड को इवेंट हैंडलर से कनेक्ट करता हूं तो प्रोग्राम कुछ भी नहीं करता है। डीबग दिखा रहा है कि sc05Server_Data उपलब्ध था, लेकिन तब कुछ भी नहीं हुआ। कार्यक्रम अभी भी उत्तरदायी है।कंसोल। इवेंट हैंडलर

यहाँ कोड:

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; 
    } 
} 

मुख्य कार्यक्रम:

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 
    } 
} 

मुझे लगता है कि यह थ्रेडिंग के साथ कुछ है - लेकिन मैं पता नहीं कैसे उन लोगों के साथ काम करना है।

+0

क्या आप अपना ईवेंट टाइप कर सकते हैं? यह घटना जिसे Sc05BdServer के अंदर लगाया जा रहा है। –

+0

क्या आप वाकई सुनिश्चित हैं कि यह 'if' स्थिति में प्रवेश नहीं कर रहा है और लौट रहा है? क्या आपने हैंडलर में ब्रेकपॉइंट रखा है यह देखने के लिए कि बाइट्स की संख्या 0 है या नहीं? –

+0

@JimMischel हाँ मुझे यकीन है कि System.Diagnostics.Debug.Print यह आउटपुट कर रहा है। – GreenEyedAndy

उत्तर

2

आप शायद किसी प्रकार की दौड़ समस्या का सामना कर रहे हैं हालांकि कंसोल उस प्रतिरक्षा होना चाहिए। इस प्रश्न को जांचें लेकिन ध्यान दें कि मैं समस्या को पुन: उत्पन्न नहीं कर सका: Strange behaviour of Console.ReadKey() with multithreading

संबंधित मुद्दे