2

我们正在努力集成两个同时运行并共享数据的不同应用程序。一个应用程序提供数据,另一个应用程序根据外部系统和数据计算一些值,并且必须将其提供回第一个应用程序。

我们正在使用这个库在应用程序之间共享数据:http: //grouplab.cpsc.ucalgary.ca/cookbook/index.php/Toolkits/Networking

该库基本上允许创建一个共享字典,任何应用程序都可以查询该字典(只要它知道共享字典的位置)。

因此,应该发生的是程序 A 必须向程序 B 提供一些数据,而程序 B 使用这些数据并将其他一些数据返回给程序 A。

我的问题是如何让程序 A 等待 B 的响应。更具体地说,我可以将一个对象放入共享字典中,另一个程序收到字典更改的通知,它可以计算一些属性和更新字典中的对象。程序 A 可以收到通知,但我希望程序 A 等到它收到此响应 - 程序 A 的操作应基于返回的值。

我认为可以做到这一点的一个非常丑陋的方法是在函数内部有一个无限循环,它不断查询字典以查看对象是否已被更新 - 如果它已经跳出循环并使用对象及其计算属性。有谁知道更好的解决方案?

4

4 回答 4

2

使用他们的订阅模式,你可以避免所有的无限循环。 当您需要检查的唯一时间是实际更新某些内容时,为什么需要循环? 由于您订阅了字典中的键模式,并且当更新/添加适合该模式的键时,您的连接将收到通知,您只需要检查它。

所以基本上,您可以使用 ManualResetEvent 来等待您自己的系统内的同步。以下是 ManualResetEvent 的使用示例:

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        //    create the reset event -- initially unsignalled
        var resetEvent = new ManualResetEvent(false);
        //    information will be filled by another thread
        string information = null;

        //    the other thread to run
        Action infoGet = delegate
        {
            //    get the information
            information = Console.ReadLine();
            //    signal the event because we're done
            resetEvent.Set();
        };

        //    call the action in a seperate thread
        infoGet.BeginInvoke(null, null);
        //    wait for completion
        resetEvent.WaitOne();
        //    write out the information
        Console.WriteLine(information);
    }
}

要转换到您的框架,您可能会让订阅处理程序检查更新的内容,找到等待句柄并发出信号,从而推进正确的等待线程。

于 2010-01-21T06:47:23.010 回答
1

使用 ManualResetEvent。

 // machine A
 var event = new ManualResetEvent(false);
 B_Listener.OnChanged += delegate { event.Set(); }
 myDictionary.UpdateValue();
 event.WaitOne();
于 2010-01-21T06:46:32.070 回答
0

如果不使用其他 IPC 方法(因为您似乎已经选择了这个特定的库),在我看来,连续轮询是唯一的方法。如果您愿意(并且能够)实现其他 IPC 方法,那么您应该停止使用当前库并自己在程序之间传递数据。

于 2010-01-21T06:35:14.700 回答
0

如果我理解正确,在程序 B 更新值之前,程序 A 不得执行任何额外的逻辑,并且程序 A 可以从 UCalgary 的该系统获得所述更新的通知。

基于这些假设,我建议在将数据发送到共享字典后,启动一个计时器,其Tick事件由一种方法处理,该方法将 (a) 检查字典的更新,或 (b) 检查获取的变量由来自共享字典库的通知设置。

找到更新后,停止计时器,并执行将开始处理新更新值的方法。

计时器与您建议的“无限循环”没有什么不同,但它几乎没有处理开销,可以设置为以实际间隔(即 1 秒、1 分钟、24 小时)进行检查,并且可以设置为时间如果程序 B 或字典没有按计划进行,请退出。

于 2010-01-21T06:42:34.890 回答