【发布时间】: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 中它正在拆分、使用数据等等,这是最少的问题。