C# 函数等待来自其他应用程序的响应
我们正致力于集成两个同时运行并共享数据的不同应用程序。一个应用程序提供数据,另一个应用程序根据外部系统和数据计算一些值,并将其提供回第一个应用程序 我们使用此库在应用程序之间共享数据: 库基本上允许创建一个共享字典,任何应用程序都可以查询它(只要它知道共享字典的位置) 所以,应该发生的是程序A必须向程序B提供一些数据,程序B使用这些数据并将一些其他数据返回给程序A 我的问题是如何让程序A等待B的响应。更具体地说,我可以将一个对象放入共享字典,另一个程序收到字典更改的通知,它可以计算一些属性并更新字典中的对象。程序A可以得到通知,但我希望程序A等到它得到这个响应——程序A的操作应该基于返回的值C# 函数等待来自其他应用程序的响应,c#,wait,sharing,synchronous,C#,Wait,Sharing,Synchronous,我们正致力于集成两个同时运行并共享数据的不同应用程序。一个应用程序提供数据,另一个应用程序根据外部系统和数据计算一些值,并将其提供回第一个应用程序 我们使用此库在应用程序之间共享数据: 库基本上允许创建一个共享字典,任何应用程序都可以查询它(只要它知道共享字典的位置) 所以,应该发生的是程序A必须向程序B提供一些数据,程序B使用这些数据并将一些其他数据返回给程序A 我的问题是如何让程序A等待B的响应。更具体地说,我可以将一个对象放入共享字典,另一个程序收到字典更改的通知,它可以计算一些属性并更新
在我看来,一个非常丑陋的方法是在函数中有一个无限循环,它不断查询字典以查看对象是否已被udpated-如果它已脱离循环并使用对象及其计算属性。有人知道更好的解决方案吗 如果不使用IPC的其他方法(因为您似乎已经习惯了这个特定的库),在我看来,连续轮询大概是唯一的方法。如果您愿意(并且能够)实现其他IPC方法,那么您应该停止使用当前库,自己在程序之间传递数据。如果我理解正确,在程序B更新该值之前,程序A不得执行任何附加逻辑,程序A可以从UCalgary的系统中获得所述更新的通知 基于这些假设,我建议在将数据发送到共享字典后,启动一个计时器,其
勾选
事件由一个方法处理,该方法将(a)检查字典的更新,或(b)检查由来自共享字典库的通知设置的变量
找到更新后,停止计时器,并执行处理新更新值的方法
计时器与您建议的“无限循环”没有什么不同,但它实际上没有处理开销,可以设置为以实际的间隔(1秒、1分钟、24小时)进行检查,并且可以设置为在程序B或字典未按计划进行时超时。使用ManualResetEvent
// machine A
var event = new ManualResetEvent(false);
B_Listener.OnChanged += delegate { event.Set(); }
myDictionary.UpdateValue();
event.WaitOne();
使用它们,您可以避免所有无限循环。当您需要检查的唯一时间是实际更新时,为什么需要循环?由于您订阅了字典中的密钥模式,并且当更新/添加该模式的密钥时,您的连接将收到通知,因此您只需检查一下即可
因此,基本上,您可以使用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);
}
}
要转换到您的框架,您可以让订阅处理程序检查更新的内容,找到等待处理程序并发出信号,从而推进正确的等待线程。我使用该库的唯一原因是它似乎使用起来很简单。但是如果有其他IPC方法可能更好,请一定告诉我。是的,但我认为它以一种奇怪的方式改变了代码结构。由于程序B在接收到程序A的更新后必须执行的所有操作现在都必须移动到另一个从Tick_事件处理程序调用的函数中,而不是像这样:
int A=getResponseFromB(key);如果(a==1).
。在tick的例子中,我认为代码应该是这样的:getResponseFromB(key)//函数在这里结束}
,然后是另一个函数(a){…},该函数从Tick事件处理程序调用。有趣的是,这感觉像是我需要的东西。我会更多地研究如何使用它。谢谢你详细的回答。我想这对我会有用的。我将尝试实现它,以确保它能够实现。非常感谢。