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






4.86/5 (22投票s)
本文提供了一个使用 WCF 和 WPF 发布实时数据的基本工作示例。
引言
这是一个用 C# .NET 3.5 编写的简单的实时数据发布器。它由两部分组成:一个 WCF 控制台服务器和一个 WPF 客户端。它演示了一种维护持久回调到多个客户端的简单方法。每个客户端订阅由服务器控制台维护。
代码演示了以下内容的实现:
- 发布/订阅实现(非事件)
- ClientCallback 订阅
- 模拟行情生成器
- 数据字典
- 多线程
- 对象序列化
如何运行
该项目中包含两个可运行的执行文件:一个 WCF 控制台 (WCFMarketDataServer.exe) 和一个 WPF 客户端 (WFCTickerWindow.exe)。
首先启动 WCF 控制台。只能运行一个实例。服务器准备就绪后,您将看到“按任意键”提示。
现在您可以启动客户端。您可以启动任意数量的客户端来模拟多个用户。每个客户端应维护其自己的一组实时数据。
当您更改组合框中的预设值时,服务器将处理订阅/取消订阅请求,以维护每个客户端订阅的正确数据。
Using the Code
下面是主要类结构的概述。我不会深入细节,但它展示了主要数据流以及订阅机制的工作方式。
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 的作用。对于中级开发人员来说,这是一个很好的框架入门项目。
我希望有人能在某种程度上从中受益,就像我一样。