所以,大约一周前我问了一个关于activex和UDP的问题。这是:
C# UDP Socket client and server
现在,我创建了两个应用程序,一个(发送者)通过UDP发送预定义的字符串。另一个是从网页调用的activex组件,它的线程正在后台运行。一旦UDP消息到达,那么它正在做它的东西(在数据库中写入,在log.txt中写入,等等)。
我需要的最后一件事就是返回数据(如果它是字符串或其他东西,还可以说)。但是,被调用的activex中的方法必须是void,因为如果它是字符串,则线程不起作用,只有第一条消息到达。
我的问题是,怎么做?如何从void函数返回数据?例如,Web应用程序现在正在调用activex DLL,如下所示:
ClassLibrary1.Class1 activex = new ClassLibrary1.Class1();
activex.StartThread();
并且StartThread()调用监听线程并且它在后台工作,一旦UDP msg到达,它就会像我上面所说的做一些事情。
如何使用线程(事件)返回值,Web应用程序将捕获并使用它?
非常感谢。
答案 0 :(得分:2)
您可以使用事件(实现Observable模式)来提醒任何侦听器新消息已到达:
public class NewMessageArgs : EventArgs
{
public string Message { get; private set; }
public NewMessageArgs(string message)
{
Message = message;
}
}
public class ActiveXComponent
{
public event EventHandler<NewMessageArgs> OnMessage;
public void StartThread()
{
while (true)
{
//do stuff
//raise "message received" event
if (OnMessage != null)
OnMessage(this, new NewMessageArgs("hi"));
}
}
}
然后你可以这样听这些事件:
ActiveXComponent activex = new ActiveXComponent();
activex.OnMessage += ProcessMessage;
activex.StartThread();
public void ProcessMessage(object sender, NewMessageArgs args)
{
var msg = args.Message;
//process
}
答案 1 :(得分:1)
基本上,您必须将一些数据存储在一个位置,您可以从这两个位置(从线程和启动线程的位置)访问它。所以你有很多选择。
我在这里假设你的线程在完成它正在做的任何事情时都会得到通知。
修改:添加了活动
答案 2 :(得分:0)
线程函数可以更改类的字段值,您可以访问这些字段,您的线程也可以触发其他类可以订阅的事件,然后对其进行操作。
Class1
{
private string value;
public string Value{get{return value;} set{value=value; FireTheEvent();}}
}