【问题标题】:event - object referance is not set to an instanse of an object windows forms C#事件 - 对象引用未设置为对象的实例 Windows 窗体 C#
【发布时间】:2015-06-01 18:59:08
【问题描述】:

我试图在一个引用到 Windows 窗体项目的 DLL 文件中引发一个事件。

当我运行程序“对象未设置为对象的实例”时,我收到以下消息:

命名空间服务器 {

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:表单 { 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);

    }



}

【问题讨论】:

  • 我不太明白 openServer 和 serverForEvent 变量的类型是什么。如果它必须按您期望的那样工作,您应该像这样创建一个 ClassServer 的实例。 ClassServer server = new ClassServer();然后设置要调用的方法——server.messageForChat += serverForEvent_messageForChat;调用方法 - server.GetMessage()
  • 您需要展示其余的相关代码,否则我们无法给出明确的答案。
  • 我已经更新了帖子...这是所有代码。

标签: c# events dll delegates


【解决方案1】:

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

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

【讨论】:

  • 我认为由于某种原因它不会分配我的处理程序,因为我试图在主项目中分配它而不是在同一个文件中。
  • @EviatarHasid - 您需要向我们展示其余的相关代码。
  • 我编辑了我的完整代码,如果你能找到为什么我的事件没有注册到函数中,请告诉我
【解决方案2】:

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

在你的情况下定义新功能如下:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多