2017-06-19 38 views
0

我正在开发一个WPF应用程序,它可以通过TCP协议重复连接到多个服务器,并有效地管理TCP连接(大约200个连接,也许更多)。有一个应用程序中的IP地址列表,我应该连接到每个地址,发送命令字符串(json对象)并获得响应作为json对象。如何创建TCP客户端并管理多个TCP连接(可能使用SocketAsyncEventArgs和Reactive Extensions)?

我应该通过使用异步编程来避免性能瓶颈并提高应用程序的整体响应能力。有一个SocketAsyncEventArgs类,它提供了可供专门的高性能套接字应用程序使用的备用异步模式。该课程专为需要高性能的网络服务器应用程序而设计。

好的,我猜SocketAsyncEventArgs是我正在寻找。为了处理请求响应,我应该创建事件处理程序和attash到Completed事件。所以我得到一个异步和基于事件的代码,这对我来说是一个难题。我已经搜索了可以帮助我处理这种情况的库,并且我找到了一个Reactive Extensions(Rx)

无功扩展器(Rx)是构成使用观察序列和LINQ风格 查询操作异步 和基于事件的程序库。使用Rx,开发人员使用Observable代表异步数据流 ,使用LINQ 运算符查询异步数据流,并使用调度程序对异步数据流 中的并发进行参数化。简而言之,Rx = Observables + LINQ + 调度程序。

没有为Web客户端无扩展的例子:

var client = new WebClient(); 
var downloadedStrings = Observable.FromEventPattern(client, 
"DownloadStringCompleted"); 
downloadedStrings.Subscribe(
data => 
{ 
    var eventArgs = (DownloadStringCompletedEventArgs)data.EventArgs; 
    if (eventArgs.Error != null) 
    Trace.WriteLine("OnNext: (Error) " + eventArgs.Error); 
    else 
    Trace.WriteLine("OnNext: " + eventArgs.Result); 
}, 
ex => Trace.WriteLine("OnError: " + ex.ToString()), 
() => Trace.WriteLine("OnCompleted")); 

client.DownloadStringAsync(new Uri("http://invalid.example.com/")); 

是否有可能把这里的SocketAsyncEventArgs实例,并用无扩展使用它呢?或者这是一个坏主意?

回答

0

您无法使用带有WebClient类的SocketAsyncEventArgs。 .Net框架中有许多用于TCP通信的类。 SocketAsyncEventArgs仅适用于Socket class。但是这个类很难使用,尝试更简单和用户友好的类,如TcpClient或WebClient。也许这些类的性能足以满足您的应用需求。所有通信类都可以通过事件或异步方法与异步编程模型一起使用。