如何从void函数返回数据?

时间:2013-11-13 14:23:57

标签: c# string multithreading sockets void

所以,大约一周前我问了一个关于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应用程序将捕获并使用它?

非常感谢。

3 个答案:

答案 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)

基本上,您必须将一些数据存储在一个位置,您可以从这两个位置(从线程和启动线程的位置)访问它。所以你有很多选择。

  1. 将其存储在数据库中
  2. 创建一个特定对象(您需要的任何类型),并将其存储在可从两个位置访问的位置。例如,一个单身人士。更简单的解决方案是在ClassLibrary.Class1类上创建一个属性:在Class1类中设置它,并从创建Class1类实例的地方获取它。
  3. 向Class1级添加一个事件,该事件在完成其工作时触发。并向EventArgs添加一些数据。
  4. 我在这里假设你的线程在完成它正在做的任何事情时都会得到通知。

    修改:添加了活动

答案 2 :(得分:0)

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

Class1
{
 private string value;
 public string Value{get{return value;} set{value=value; FireTheEvent();}}
}