【问题标题】:Alert after an event in C#在 C# 中发生事件后发出警报
【发布时间】:2013-12-04 08:59:54
【问题描述】:

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

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 会引发一个事件,客户端获取该事件并进行更改(文本框以及将来的一些其他内容)。

有什么解决办法吗?我已经厌倦了这个项目,需要尽快完成它,这样我才能转向其他更重要的事情。

【问题讨论】:

  • 使用 Deligates ... 事件它会给你解决方案
  • 您是在调用与网页相关的事件吗? ....
  • 否,当 UDP 消息从 Avaya 系统到达时触发事件。这是一个字符串,在 DLL 中它正在拆分、使用数据等等,这是最少的问题。

标签: c# events dll


【解决方案1】:

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

Dispatcher.Invoke(new Action(() => { txtIncomingVDN.Text = MSG; }));

在windows窗体中是这样的

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

【讨论】:

  • 它是 c# 和 .NET 2.0 中的基于 Web 的应用程序,所以这不起作用。还有其他想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2015-09-04
  • 2021-11-20
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多