2

所以,大约一周前,我问了一个关于 activex 和 UDP 的问题。这里是:

C# UDP Socket 客户端和服务器

现在,我创建了两个应用程序,一个(发送方)通过 UDP 发送预定义的字符串。另一个是从网页调用的activex组件,它的线程在后台工作。一旦 UDP 消息到达,它就会做它的事情(写入数据库,写入 log.txt,等等)。

我需要做的最后一件事是返回数据(它是字符串还是其他东西还有待说)。但是,被调用的activex中的方法必须是一个void,因为如果它是字符串,线程将无法工作,只有第一条消息会到达。

我的问题是,如何做到这一点?如何从 void 函数返回数据?例如,Web 应用程序现在正在调用 activex DLL,如下所示:

    ClassLibrary1.Class1 activex = new ClassLibrary1.Class1();
    activex.StartThread();

StartThread() 调用监听线程,它在后台工作,一旦 UDP msg 到达,它就会像我上面所说的那样做一些事情。

我如何使用线程(事件)返回值,并且 Web 应用程序将捕获并使用它?

非常感谢。

4

3 回答 3

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
}
于 2013-11-13T14:40:17.193 回答
1

基本上,您必须将一些数据存储在可以从两个位置(从线程和启动线程的位置)访问的位置。所以你有几个选项从我的头顶。

  1. 将其存储在数据库中
  2. 创建一个特定的对象(您需要的任何类型),并将其存储在可以从两个地方访问的地方。例如,单例。一个更简单更好的解决方案是在 ClassLibrary.Class1 类上创建一个属性:从 Class1 类中设置它,并从您创建 Class1 类实例的位置获取它。
  3. 向您的 Class1 类添加一个事件,该事件在完成工作时触发。并向 EventArgs 添加一些数据。

我假设在这里你会在你的线程完成它正在做的任何事情时得到通知。

编辑:添加事件

于 2013-11-13T14:31:53.807 回答
0

线程函数可以更改类的字段值,您可以访问这些字段,您的线程也可以触发其他类可以订阅的事件,然后对其进行操作。

Class1
{
 private string value;
 public string Value{get{return value;} set{value=value; FireTheEvent();}}
}
于 2013-11-13T14:33:51.740 回答