我们正致力于集成两个同时运行并共享数据的不同应用程序。一个应用程序提供数据,另一个应用程序根据外部系统和数据计算一些值,并且必须将其提供给第一个应用程序。
我们正在使用此库在应用程序之间共享数据:http://grouplab.cpsc.ucalgary.ca/cookbook/index.php/Toolkits/Networking
该库基本上允许创建一个可由任何应用程序查询的共享字典(只要它知道共享字典的位置)。
那么,应该发生的是程序A必须向程序B提供一些数据,程序B使用这些数据并将一些其他数据返回给程序A.
我的问题是如何使程序A等待来自B的响应。更具体地说,我可以将一个对象放在共享字典中,另一个程序会收到字典中的更改通知,它可以计算一些属性和更新字典中的对象。程序A可以得到通知,但是我希望程序A等到它回复这个响应 - 程序A的动作应该基于返回的值。
一种非常丑陋的方式我认为可以做到的是在函数内部有一个无限循环,它不断查询字典以查看对象是否已被更新 - 如果它已经脱离循环并使用该对象及其计算属性。有谁知道更好的解决方案?
答案 0 :(得分:2)
使用他们的subscription model,您可以避免所有无限循环。 为什么在需要检查的时候才需要循环才能实际更新某些内容?由于您订阅了字典中的关键模式,并且当符合该模式的键时,将通知您的连接更新/添加,您只需要检查。
基本上,您可以使用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);
}
}
要翻译到您的框架,您可能让订阅处理程序检查更新的内容,找到等待句柄并发出信号,从而推进正确的等待线程。
答案 1 :(得分:1)
使用ManualResetEvent。
// machine A
var event = new ManualResetEvent(false);
B_Listener.OnChanged += delegate { event.Set(); }
myDictionary.UpdateValue();
event.WaitOne();
答案 2 :(得分:0)
不使用其他IPC方法(因为你似乎已经解决了这个特定的库),在我看来,连续轮询是唯一的方法。如果您愿意(并且有能力)实现其他IPC方法,那么您应该停止使用当前库,并且只是自己在程序之间传递数据。
答案 3 :(得分:0)
如果我理解正确,在程序B更新了值之前,程序A不得执行任何其他逻辑,程序A可以从UCalgary获得该系统的所述更新通知。
基于这些假设,我建议在将数据发送到共享字典后,启动一个计时器,其Tick
事件由一个方法处理,该方法将(a)检查字典中的更新,或者(b)检查由共享字典库中的通知设置的变量。
找到更新后,停止计时器,然后执行将处理新更新值的方法。
计时器与您建议的“无限循环”没有什么不同,但它实际上没有处理开销,可以设置为以实际间隔(1秒,1分钟,24小时)进行检查,并且可以设置如果事情没有按照计划B或字典的计划进行,那就等了很久。