event - object引用没有被设置为对象的实例

本文关键字:设置 对象 实例 object 引用 event | 更新日期: 2023-09-27 17:52:36

我试图在引用windows窗体项目的DLL文件中引发事件。

当我运行程序"Object is not set to an instance of an Object "时,我有以下消息:

命名空间服务器{

public delegate void messageHnadler();

public class ClassServer
{

    public event messageHnadler messageForChat


    public string Message { get; set; }
    public Socket listenerSocket;
    public BinaryFormatter transBinary;
    public Thread threadingServer;
    public TcpListener listenerServer;


    private List<TcpClient> connectedClients = new List<TcpClient>();

    public bool OpenServer(string ipAddress, int PortNumber)
    {
        try
        {
            listenerServer = new TcpListener(IPAddress.Parse(ipAddress), PortNumber);//creating listener for clients to connect
            listenerServer.Start();
            threadingServer = new Thread(LoopThroughClients);
            threadingServer.Start();
            threadingServer = new Thread(GetMessage);
            threadingServer.Start();

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
    public void LoopThroughClients()
    {
        listenerSocket = listenerServer.AcceptSocket();
    }

    public void GetMessage()
    {
        while (true)
        {
            if (listenerSocket != null)
            {
                NetworkStream streamWithClient = new NetworkStream(listenerSocket);
                transBinary = new BinaryFormatter();
                string stringFromClient = (string)transBinary.Deserialize(streamWithClient);
                if (stringFromClient != null)
                {
                    Message = stringFromClient;
                    messageForChat();
                }
                streamWithClient = new NetworkStream(listenerSocket);
                BinaryFormatter tranBinary = new BinaryFormatter();

                tranBinary.Serialize(streamWithClient, stringFromClient);
                stringFromClient = null;
            }
        }
    }

在windows窗体项目中,我将事件签名为函数:

Chat_Project_Server_UI

名称空间{公共分部类SeverUI: Form{OpenServerForm openServer = new OpenServerForm();ClassServer serverForEvent = new ClassServer();

    public SeverUI()
    {
        InitializeComponent();
        openServer.ShowDialog();
        serverForEvent.messageForChat += new messageHnadler(serverForEvent_messageForChat);  
        OpenningServer();

    }
    public void OpenningServer()
    {

        if(openServer.IsConnected)
        {
            ChatTextBox.AppendText("SERVER OPEN!'n");
        }
        else
        {
            ChatTextBox.AppendText("Faild to open server...'n");
        }
    }
    private void test_Click(object sender, EventArgs e)
    {
        ChatTextBox.AppendText("aaaaa");
    }
    public void EventHolder()
    {
    }
    void serverForEvent_messageForChat()
    {
        ChatTextBox.AppendText(serverForEvent.Message);
    }

}

event - object引用没有被设置为对象的实例

始终检查处理程序是否已分配,如下所示:

var handler = messageForChat;
if (handler != null)
    handler()

在类中处理事件的标准方法是创建一个名为OnXxx的方法,并始终检查事件是否被分配处理程序

在你的例子中定义如下的新函数:

protected void OnMessageForChat(){
    //protected modifier allows subclasses to raise the event by calling this method
    if (messageForChat!=null)messageForChat();
}

当你想触发事件时只需调用这个函数