event - 对象referance未设置为对象windows form C#的实例

时间:2015-06-01 08:52:29

标签: c# events dll delegates

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

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

命名空间服务器 {

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 {     public partial class 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);

    }



}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

在您的情况下定义新函数如下:

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

当你想举起活动时,只需调用此函数