Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数等待来自其他应用程序的响应_C#_Wait_Sharing_Synchronous - Fatal编程技术网

C# 函数等待来自其他应用程序的响应

C# 函数等待来自其他应用程序的响应,c#,wait,sharing,synchronous,C#,Wait,Sharing,Synchronous,我们正致力于集成两个同时运行并共享数据的不同应用程序。一个应用程序提供数据,另一个应用程序根据外部系统和数据计算一些值,并将其提供回第一个应用程序 我们使用此库在应用程序之间共享数据: 库基本上允许创建一个共享字典,任何应用程序都可以查询它(只要它知道共享字典的位置) 所以,应该发生的是程序A必须向程序B提供一些数据,程序B使用这些数据并将一些其他数据返回给程序A 我的问题是如何让程序A等待B的响应。更具体地说,我可以将一个对象放入共享字典,另一个程序收到字典更改的通知,它可以计算一些属性并更新

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

我们使用此库在应用程序之间共享数据:

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

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

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


在我看来,一个非常丑陋的方法是在函数中有一个无限循环,它不断查询字典以查看对象是否已被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事件处理程序调用。有趣的是,这感觉像是我需要的东西。我会更多地研究如何使用它。谢谢你详细的回答。我想这对我会有用的。我将尝试实现它,以确保它能够实现。非常感谢。