来自EventHandler的Console.Writeline

8
我写了一个简单的异步TCP服务器,它运行良好。但现在我想在控制台测试程序上输出接收到的数据。问题是,这并没有起作用!如果我将主线程连接到事件处理程序,程序什么也不做。调试显示sc05Server_DataAvailable被调用,但之后什么也没发生。程序仍然可以响应。

以下是代码:

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

我认为这与线程有关 - 但我不知道如何使用它们。


你能发布一下你的事件类型吗?这个事件是在Sc05BdServer内部被挂钩的。 - d.moncada
你确定它没有进入“if”条件并返回吗?你是否在处理程序中设置了断点以查看读取的字节数是否为0? - Jim Mischel
@JimMischel 是的,我确定 System.Diagnostics.Debug.Print 正在进行输出。 - GreenEyedAndy
2
我不确定,但请查看几天前发布的这个问题,也许您遇到了类似的问题:https://dev59.com/eGUp5IYBdhLWcg3wo4uc#HIwHoYgBc1ULPQZFXnQg - Nikola Davidovic
1
@NikolaDavidovic:你应该发布一个答案(即使这个问题有点重复)。 :) - leppie
显示剩余3条评论
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接