65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# / NET / WCF / WPF 实现的简单实时行情显示

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (22投票s)

2008 年 10 月 1 日

CPOL

2分钟阅读

viewsIcon

143807

downloadIcon

4598

本文提供了一个使用 WCF 和 WPF 发布实时数据的基本工作示例。

引言

这是一个用 C# .NET 3.5 编写的简单的实时数据发布器。它由两部分组成:一个 WCF 控制台服务器和一个 WPF 客户端。它演示了一种维护持久回调到多个客户端的简单方法。每个客户端订阅由服务器控制台维护。

代码演示了以下内容的实现:

  • 发布/订阅实现(非事件)
  • ClientCallback 订阅
  • 模拟行情生成器
  • 数据字典
  • 多线程
  • 对象序列化

Overview Class Structure

如何运行

该项目中包含两个可运行的执行文件:一个 WCF 控制台 (WCFMarketDataServer.exe) 和一个 WPF 客户端 (WFCTickerWindow.exe)。

首先启动 WCF 控制台。只能运行一个实例。服务器准备就绪后,您将看到“按任意键”提示。

WCF Console

现在您可以启动客户端。您可以启动任意数量的客户端来模拟多个用户。每个客户端应维护其自己的一组实时数据。

WPF Client

当您更改组合框中的预设值时,服务器将处理订阅/取消订阅请求,以维护每个客户端订阅的正确数据。

Using the Code

下面是主要类结构的概述。我不会深入细节,但它展示了主要数据流以及订阅机制的工作方式。

Detailed Class overview

WCF 服务器控制台以编程方式配置,使用 TCP 通道。

    // Service htpp address
    CMarkerConfig.LogInfo("Creating URI...");
    Uri baseAddress = new Uri("net.tcp://:8080/MarketData");

    // Create new WCF Service host
    CMarkerConfig.LogInfo("Creating ServiceHost...");
    serviceHost = new ServiceHost(typeof(CMarketDataManager), baseAddress);


    // Add the htpp end point 
    NetTcpBinding pNetTcpBinding = new NetTcpBinding(SecurityMode.Transport);


    CMarkerConfig.LogInfo("Adding Endpoint...");
    serviceHost.AddServiceEndpoint(typeof(IMarketData), pNetTcpBinding, baseAddress);

    // Add the Metadata
    CMarkerConfig.LogInfo("Adding Metadata behavior...");
    ServiceMetadataBehavior servicemetadatabehavior = new ServiceMetadataBehavior();
    servicemetadatabehavior.HttpGetEnabled = true;
    servicemetadatabehavior.HttpGetUrl = new Uri("https://:8081/MarketData");
    serviceHost.Description.Behaviors.Add(servicemetadatabehavior);

以下是服务契约:

    //----------------------------------------------------------------------------------
    /// <summary>
    /// Callback contract to update clients with TickUpdate data stream.
    /// </summary>

    interface IClientCallback
    {
        //-------------------------------------------------------------
        [OperationContract(IsOneWay = true)]
        void SendTickUpdate(TickUpdate pTickUpdate);
    }

    //-----------------------------------------------------------------------------------
    /// <summary>
    /// WCF Contracts for client interaction with this service
    /// </summary>
    [ServiceContract(Namespace = "tcp:///", CallbackContract = typeof(
        IClientCallback))]
    interface IMarketData
    {
        //-------------------------------------------------------------
        [OperationContract]
        string[] GetSymbolList();

        //-------------------------------------------------------------
        [OperationContract]
        StringCollection GetDataSourceList();

        //-------------------------------------------------------------
        [OperationContract]
        string[] GetFieldList();

        //-------------------------------------------------------------
        [OperationContract]
        void SubscribeRT(CGenericMsg pCGenericMsg);
    }

所有数据更新都通过 WPF 客户端实现的 IClientCallback 发送。

SubscribeRT() 方法设计为接收一个 CGenericMsg 对象。该对象是通用的,因此可以在不更改契约的情况下添加多种类型的消息。

关注点

这个示例帮助我更好地理解了 WCF 和 WPF 的作用。对于中级开发人员来说,这是一个很好的框架入门项目。

我希望有人能在某种程度上从中受益,就像我一样。

© . All rights reserved.