我还在做一个项目,之前问了两个问题:
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会引发一个事件,客户端获取该事件并进行更改(文本框以及将来的其他一些内容)。
任何解决方案?我已经厌倦了这个项目,需要尽快完成它,这样我才能转向其他更重要的事情。
答案 0 :(得分:0)
也许您需要在UI线程上调用Text更改。在WPF中,您可以使用
执行此操作Dispatcher.Invoke(new Action(() => { txtIncomingVDN.Text = MSG; }));
在Windows窗体中,它就像
txtIncomingVDN.beginInvoke(() => { txtIncomingVDN.Text = MSG; }));