两个.Net应用程序之间的高效通信

我目前正在c#中编写一个.Net应用程序,它有两个主要组件:

  1. DataGenerator – 一个生成大量数据的组件
  2. Viewer – 一个WPF应用程序,能够可视化生成器创建的数据

这两个组件目前是我的解决方案中的两个独立项目。 此外,我正在使用PRISM 4.0框架,以便从这些组件中创建模块。

实质上,DataGenerator使用PRISM的EventAggregator生成大量数据并发送事件,Viewer会订阅这些事件并显示为用户准备的数据。

现在我的要求略有改变,现在两个组件将在他们自己的应用程序中运行(但在同一台计算机上)。 我仍然希望所有的通信事件驱动,我还想使用PRISM框架。

我的第一个想法是使用WCF进行这两个应用程序之间的通信。 然而,有一件事让生活变得更加艰难:

  1. DataGenerator完全不了解 Viewer( 也没有依赖关系
  2. 如果我们没有打开查看器,或者我们关闭查看器应用程序,DataGenerator应该仍然可以正常工作。
  3. 当前很多事件都是从DataGenerator上升的(使用EventAggregator):WCF是否足够高效,可以在很短的时间内处理大量事件?

基本上所有这些事件所携带的数据都是非常简单的字符串,整数和布尔值。 如果没有WCF,可以采用更轻量级的方式吗?

最后,如果DataGenerator可以发送这些事件并且可能有多个应用程序订阅它们(或者没有),那将是很好的。

任何建议和提示都非常感谢。

谢谢! 基督教

编辑1

我现在正在创建两个简单的控制台应用程序(一个托管服务并发送消息,另一个接收消息)使用WCF和回调(如建议的那样)。 一旦我开始工作,我将添加工作代码。

编辑2

好的 – 管理一个简单的程序运行! :)谢谢你的帮助,伙计们! 以下是代码和图片的位置:

在此处输入图像描述

让我们从发件人开始:

在我的应用程序中,发件人包含服务接口及其实现。

IMessageCallback是回调接口:

namespace WCFSender { interface IMessageCallback { [OperationContract(IsOneWay = true)] void OnMessageAdded(string message, DateTime timestamp); } } 

ISimpleService是服务合同:

 namespace WCFSender { [ServiceContract(CallbackContract = typeof(IMessageCallback))] public interface ISimpleService { [OperationContract] void SendMessage(string message); [OperationContract] bool Subscribe(); [OperationContract] bool Unsubscribe(); } } 

SimpleService是ISimpleService的实现:

 public class SimpleService : ISimpleService { private static readonly List subscribers = new List(); public void SendMessage(string message) { subscribers.ForEach(delegate(IMessageCallback callback) { if (((ICommunicationObject)callback).State == CommunicationState.Opened) { callback.OnMessageAdded(message, DateTime.Now); } else { subscribers.Remove(callback); } }); } public bool Subscribe() { try { IMessageCallback callback = OperationContext.Current.GetCallbackChannel(); if (!subscribers.Contains(callback)) subscribers.Add(callback); return true; } catch { return false; } } public bool Unsubscribe() { try { IMessageCallback callback = OperationContext.Current.GetCallbackChannel(); if (!subscribers.Contains(callback)) subscribers.Remove(callback); return true; } catch { return false; } } } 

在Program.cs中(在发送方),托管服务并发送消息:

 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] class Program : SimpleServiceReference.ISimpleServiceCallback, IDisposable { private SimpleServiceClient client; static void Main(string[] args) { ServiceHost myService = new ServiceHost(typeof(SimpleService)); myService.Open(); Program p = new Program(); p.start(); Console.ReadLine(); } public void start() { InstanceContext context = new InstanceContext(this); client = new SimpleServiceReference.SimpleServiceClient(context, "WSDualHttpBinding_ISimpleService"); for (int i = 0; i < 100; i++) { client.SendMessage("message " + i); Console.WriteLine("sending message" + i); Thread.Sleep(600); } } public void OnMessageAdded(string message, DateTime timestamp) { throw new NotImplementedException(); } public void Dispose() { client.Close(); } } 

此外,请注意服务引用已添加到Sender项目中!

让我们现在到达接收方:

正如在Sender中已经完成的那样,我在项目中添加了服务引用。

Program.cs只有一个类:

 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] class Program : SimpleServiceReference.ISimpleServiceCallback, IDisposable { private SimpleServiceClient client; static void Main(string[] args) { Program p = new Program(); p.start(); Console.ReadLine(); p.Dispose(); } public void start() { InstanceContext context = new InstanceContext(this); client = new SimpleServiceReference.SimpleServiceClient(context, "WSDualHttpBinding_ISimpleService"); client.Subscribe(); } public void OnMessageAdded(string message, DateTime timestamp) { Console.WriteLine(message + " " + timestamp.ToString()); } public void Dispose() { client.Unsubscribe(); client.Close(); } } 

剩下的最后一件事是app.config文件。 在客户端,通过添加服务引用自动生成app.config。 在服务器端,我稍微改变了配置,但是它的一部分也是通过添加服务引用自动生成的。 请注意,您需要在添加服务引用之前进行更改:

                                               

重要提示:我设法使用教程实现了这两个非常简单的应用程序。 上面的代码对我有用,希望能帮助其他人理解WCF回调。 它不是编写得非常好的代码,不应该完全使用! 它只是一个简单的示例应用程序。

不要担心性能,如果配置正确,wcf可以达到非常高的吞吐量。 为您的活动使用回调: http : //www.switchonthecode.com/tutorials/wcf-tutorial-events-and-callbacks

将WCF与回调一起使用,配置正确时非常有效。

以下是一些基准测试: http : //msdn.microsoft.com/en-us/library/bb310550.aspx

以下是使用回调的一个很好的示例: http : //idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx

使用Microsoft StreamInsight 1.2 。 用例描述,它可以嵌入到应用程序,WCF服务或两者中。

阅读MSDN文章 abou StreamInsight 1.2:

Microsoft®StreamInsight是Microsoft的复杂事件处理技术,可帮助企业创建事件驱动的应用程序,并通过将来自多个源的事件流与几乎零延迟相关联来获得更好的洞察力。

Microsoft StreamInsight™是一个function强大的平台,可用于开发和部署复杂事件处理(CEP)应用程序。 其高吞吐量流处理架构和基于Microsoft .NET Framework的开发平台使您能够快速实现强大而高效的事件处理应用程序。 事件流源通常包括来自制造应用程序,金融交易应用程序,Web分析和操作分析的数据。 通过使用StreamInsight,您可以开发CEP应用程序,通过降低提取,分析和关联数据的成本,从这些原始数据中获得直接的业务价值; 并允许您几乎立即监控,管理和挖掘数据中的条件,机会和缺陷。

通过使用StreamInsight开发CEP应用程序,您可以为您的业务实现以下战术和战略目标:

  • 监控来自多个来源的数据,以获得有意义的模式,趋势,例外和机会。

  • 在数据传输过程中逐步分析和关联数据 – 即,无需先存储数据 – 产生非常低的延迟。 汇总来自多个来源的看似无关的事件,并随着时间的推移执行高度复杂的分析。

  • 通过对事件执行低延迟分析并触发在业务关键性能指标(KPI)上定义的响应操作来管理业务。

  • 通过将您的KPI定义纳入CEP应用程序的逻辑,快速响应机会或威胁领域,从而提高运营效率和快速响应商机的能力。

  • 挖掘新业务KPI的事件。

  • 通过挖掘历史数据来转向预测业务模型,以不断改进和改进您的KPI定义。

其他信息和样品可在CodePlex找到: