使用 Silverlight 构建业务线企业级应用程序,第 1 部分
2009-02-05 11:54:46 来源:WEB开发网为了使 Silverlight 能够在浏览器运行时环境中正常工作,它应该尽可能少干预资源。前面所示的 "socket accept" 伪代码中的所有调用都会阻塞其执行线程,并因此对可伸缩性产生负面影响。因此,Silverlight 在阻塞调用方面限制很多,实际上它只允许与网络资源进行异步交互。异步循环需要调整思维模式,您可以假想它是一个不可见的信箱,并且它任何时候都包含至少一个请求以便使循环能够工作。
图 4 显示了一个 receive 循环(代码下载中包含更完整的实现)。在该实现中并没有类似于前面同步套接字 accept 伪代码中所示的 while (true) 无限循环编程结构。习惯使用这种编程结构对于 Silverlight 开发人员来说至关重要。为了使 receive 循环能够在已接收并处理完消息后继续接收数据,队列中至少应包含一个对已连接套接字关联 I/O 完成端口的请求。典型的 async 循环如图 5 所示,它适用于 ConnectAsync、ReceiveAsync 和 SendAsync。在使用 .NET Framework 3.5 的服务器上可以将 AcceptAsync 添加到此列表。
图 4 使用 Silverlight 套接字的 Async Send/Receive 循环
public class CallNetworkClient
{
private Socket _socket;
private ReceiveBuffer _receiveBuffer;
public event EventHandler<EventArgs> OnConnectError;
public event EventHandler<ReceiveArgs> OnReceive;
public SocketAsyncEventArgs _receiveArgs;
public SocketAsyncEventArgs _sendArgs;
//removed for space
public void ReceiveAsync()
{
ReceiveAsync(_receiveArgs);
}
private void ReceiveAsync(SocketAsyncEventArgs recvArgs)
{
if (!_socket.ReceiveAsync(recvArgs))
{
ReceiveCallback(_socket, recvArgs);
}
}
void ReceiveCallback(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError != SocketError.Success)
{
return;
}
_receiveBuffer.Offset += e.BytesTransferred;
if (_receiveBuffer.IsMessagePresent())
{
if (OnReceive != null)
{
NetworkMessage msg =
NetworkMessage.Deserialize(_receiveBuffer.Buffer);
_receiveBuffer.AdjustBuffer();
OnReceive(this, new ReceiveArgs(msg));
}
}
else
{
//adjust the buffer pointer
e.SetBuffer(_receiveBuffer.Offset, _receiveBuffer.Remaining);
}
//queue an async read request
ReceiveAsync(_receiveSocketArgs);
}
public void SendAsync(NetworkMessage msg) { ... }
private void SendAsync(SocketAsyncEventArgs sendSocketArgs)
{
...
}
void SendCallback(object sender, SocketAsyncEventArgs e)
{
...
}
}
Tags:使用 Silverlight 构建
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接