在C#中发生事件后发出警报

时间:2013-12-04 08:59:54

标签: c# events dll

我还在做一个项目,之前问了两个问题:

C# UDP Socket client and server

How to return data from void function?

现在,我已经制作了ActiveX,我需要客户端来监听这个事件。我在第二个链接中使用了这个例子,它有用 - 有点儿。 Activex DLL正在引发一个事件,客户端应用正在监听它,但是无法对它做任何事情,甚至无法在客户端发送通知。

在DLL中我有这个:

    public event EventHandler<NewMessageArgs> OnMessage;

    public class NewMessageArgs : EventArgs
        {
            public NewMessageArgs(string message)
            {
                Message = message;
            }
            public string Message;
            public string _message { get { return Message; } set { Message = value; } }
        }

private Thread UdpThread;
        public void StartThread()
        {
            #region StartThread
            try
            {
                UdpThread = new Thread(new ThreadStart(StartListen));
                UdpThread.IsBackground = true;
                UdpThread.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            #endregion
        }

[ComVisible(true)]
        public void StartListen()
        {
            #region StartListen
            private const int listenPort = 11000;
            try
            {
                int Port = 11000;
                UdpClient udpClient = new UdpClient(Port);
                IPEndPoint remoteIpEndPoint = new IPEndPoint(System.Net.IPAddress.Any, Port);

                byte[] receiveBytes;

                while (true)
                {
                    receiveBytes = udpClient.Receive(ref remoteIpEndPoint);
                    string receiveData = Encoding.Default.GetString(receiveBytes);
                    //do some other stuff, and on event when MSG arrives:

               OnMessage(this, new NewMessageArgs(receiveData));

在使用此DLL的客户端上,我有:

public partial class _Default : System.Web.UI.Page 
{
    public static string MSG;

    static public ActiveXComponent.Class1 activex;


    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            activex = new ActiveXComponent.Class1();
            activex.getConnectionString(data_connection);
            //activex.OnMessage += ProcessMessage; - I tried this first, the later second, but still same result
            activex.OnMessage += new EventHandler<NewMessageArgs>(ProcessMessage);
            activex.StartThread();
        }
    }

    public void ProcessMessage(object sender, NewMessageArgs args)
    {
        MSG= args.Message;
        this.txtIncomingVDN.Text = MSG;
        Response.Write(@"<script language='javascript'>alert('A message has arrived: \n" + MSG+ " .');</script>");    
    }

在调试模式下,我可以看到客户端正在侦听并将数据存储在MSG变量中。但是,文本框中的文本不会更改,也不能进行响应,因为它给出了一个错误“响应在此上下文中不可用”。

基本上,当UDP消息接收时,DLL会引发一个事件,客户端获取该事件并进行更改(文本框以及将来的其他一些内容)。

任何解决方案?我已经厌倦了这个项目,需要尽快完成它,这样我才能转向其他更重要的事情。

1 个答案:

答案 0 :(得分:0)

也许您需要在UI线程上调用Text更改。在WPF中,您可以使用

执行此操作
Dispatcher.Invoke(new Action(() => { txtIncomingVDN.Text = MSG; }));

在Windows窗体中,它就像

txtIncomingVDN.beginInvoke(() => { txtIncomingVDN.Text = MSG; }));