C# 尝试使用事件处理程序捕获

C# 尝试使用事件处理程序捕获,c#,winforms,sockets,try-catch,C#,Winforms,Sockets,Try Catch,我有一个客户端连接到我的服务器,现在使用下面的代码进行连接。但是,如果无法建立连接,则会创建一个事件,以便在主程序失败时显示一条消息。但这一事件并没有被触发。如何更正代码以实现此目的 客户端套接字的包装器类 public class ClientWrapper { Socket clientSocket; public delegate void ErrorMessageHandler(string errorMsg); public event ErrorMessage

我有一个客户端连接到我的服务器,现在使用下面的代码进行连接。但是,如果无法建立连接,则会创建一个事件,以便在主程序失败时显示一条消息。但这一事件并没有被触发。如何更正代码以实现此目的

客户端套接字的包装器类

public class ClientWrapper
{
    Socket clientSocket;
    public delegate void ErrorMessageHandler(string errorMsg);
    public event ErrorMessageHandler OnErrorRecieved;

    public ClientWrapper(IPAddress serverIP, int port)
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            clientSocket.Connect(new IPEndPoint(serverIP, port));
        }
        catch (Exception e)
        {
            if (OnErrorRecieved != null)
                OnErrorRecieved(e.Message);
        }
    }
}
在我的程序代码中,使用事件的位置

//Connect to Server
ClientWrapper clientSocket = new ClientWrapper(serverIP, port);

//Event trigger if client fails to connect to server

clientSocket.OnErrorRecieved += new ClientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
以及事件的方法

void clientSocket_OnErrorRecieved(string errorMsg)
{
    MessageBox.Show("No response from server. This can be caused if Server is offline or incorrect detail is provided.", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
clientSocket.OnErrorRecieved += new ClientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);

这是因为在将事件绑定到构造函数之前,构造函数已经在连接。 应使用构造函数以外的方法连接:

public void Connect(IPAddress serverIP, int port)
{
    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            clientSocket.Connect(new IPEndPoint(serverIP, port));
        }
        catch (Exception e)
        {
            if (OnErrorRecieved != null)
                OnErrorRecieved(e.Message);
        }

}
并以这种方式构建它

ClientWrapper clientSocket = new ClientWrapper();
clientSocket.OnErrorRecieved += new clientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
clientSocket.Connect(serverIP, port);

只有在连接之前绑定该事件时才会触发该事件。

这是因为在将事件绑定到它之前,构造函数已在连接。 应使用构造函数以外的方法连接:

public void Connect(IPAddress serverIP, int port)
{
    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            clientSocket.Connect(new IPEndPoint(serverIP, port));
        }
        catch (Exception e)
        {
            if (OnErrorRecieved != null)
                OnErrorRecieved(e.Message);
        }

}
并以这种方式构建它

ClientWrapper clientSocket = new ClientWrapper();
clientSocket.OnErrorRecieved += new clientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
clientSocket.Connect(serverIP, port);

只有在连接之前绑定该事件时才会触发该事件。

在构造函数中引发事件时,在注册事件处理程序之前,事件似乎已失败


对于您可以尝试的方法,有很多选项,例如将事件处理程序传递给构造函数,以便它可以在被调用之前订阅,或者将连接代码分解为单独的方法,让使用者有机会自己订阅错误处理程序。

在构造函数中引发事件处理程序时,在注册事件处理程序之前,您的事件似乎已经失败

对于您可以尝试的方法,有许多选项,例如将事件处理程序传递给构造函数,以便它可以在被调用之前订阅,或者将连接代码分解为单独的方法,以便消费者有机会自己订阅错误处理程序。

当您调用该行时

ClientWrapper clientSocket = new ClientWrapper(serverIP, port);
构造函数开始运行。只有当它结束时,才连接事件

void clientSocket_OnErrorRecieved(string errorMsg)
{
    MessageBox.Show("No response from server. This can be caused if Server is offline or incorrect detail is provided.", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
clientSocket.OnErrorRecieved += new ClientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
你有两种简单的方法可以做到这一点

第一个是Jeroen van Langen提出的建议

第二个是ask,在委托的构造函数中:

public ClientWrapper(IPAddress serverIP, int port, ErrorMessageHandler method)
{
    OnErrorRecieved += method;

    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    try
    {
        clientSocket.Connect(new IPEndPoint(serverIP, port));
    }
    catch (Exception e)
    {
        if (OnErrorRecieved != null)
            OnErrorRecieved(e.Message);
    }
}
另外,请在使用套接字时使用
using
语句

ClientWrapper clientSocket = new ClientWrapper(serverIP, port);
构造函数开始运行。只有当它结束时,才连接事件

void clientSocket_OnErrorRecieved(string errorMsg)
{
    MessageBox.Show("No response from server. This can be caused if Server is offline or incorrect detail is provided.", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
clientSocket.OnErrorRecieved += new ClientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
你有两种简单的方法可以做到这一点

第一个是Jeroen van Langen提出的建议

第二个是ask,在委托的构造函数中:

public ClientWrapper(IPAddress serverIP, int port, ErrorMessageHandler method)
{
    OnErrorRecieved += method;

    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    try
    {
        clientSocket.Connect(new IPEndPoint(serverIP, port));
    }
    catch (Exception e)
    {
        if (OnErrorRecieved != null)
            OnErrorRecieved(e.Message);
    }
}

另外,在使用socket时,请使用
using
语句,我建议传递一个类而不是委托。与线程构造函数相同。Like ClientWrapperInfo=new ClientWrapperInfo();info.ServerIP=“”;信息端口=12345;info.onerrorReceived+=新的ClientWrapper.ErrorMessageHandler(clientSocket_onerrorReceived);ClientWrapper clientSocket=新的ClientWrapper(info);这样,您就不必在构造函数上实现重载。@JeroenvanLangen很抱歉,我无法在注释中阅读所有这些代码。。。。但你们要知道传递委托是完全正常的,当你们只需要其中的一个参数时,你们不应该传递整个类。在这个构造中,我建议传递一个类而不是委托。与线程构造函数相同。Like ClientWrapperInfo=new ClientWrapperInfo();info.ServerIP=“”;信息端口=12345;info.onerrorReceived+=新的ClientWrapper.ErrorMessageHandler(clientSocket_onerrorReceived);ClientWrapper clientSocket=新的ClientWrapper(info);这样,您就不必在构造函数上实现重载。@JeroenvanLangen很抱歉,我无法在注释中阅读所有这些代码。。。。但要知道传递委托是完全正常的,当您只需要一个参数时,不应该传递整个类it@daJbot你也可以给他+1:)@daJbot你也可以给他+1:)