Silverlight Sockets中的超时

本文关键字:超时 Sockets Silverlight | 更新日期: 2023-09-27 17:53:36

我在Silverlight应用程序中使用Socket s从服务器流数据到客户端。

然而,我不太确定如何在Silverlight Socket中处理超时。
在文档中,我看不到任何像ReceiveTimeout的Silverlight。

  • 用户定义的超时是否可能?我怎么设置它们?当发送/接收操作超时时,我如何获得通知?
  • 是否有默认超时?它们有多大?
  • 如果没有超时:手动实现这些超时的最简单方法是什么?

Silverlight Sockets中的超时

我已经检查了Reflector中的Socket类,并且没有一个相关的setsockopt调用处理超时-除了Dispose方法。看起来Silverlight只是依赖于WinSock API的默认超时。

Socket类还包含一个"SetSocketOption"方法,该方法是私有的,您可能能够通过反射调用-尽管它很可能会遇到安全异常。

因为我找不到任何好的解决方案,我通过创建一个System.Threading.Timer来手动解决这个问题,代码类似于以下:

System.Threading.Timer t;
bool timeout;
[...]
// Initialization
t = new Timer((s) => {
    lock (this) {
        timeout = true;
        Disconnected();
    }
});
[...]
// Before each asynchronous socket operation
t.Change(10000, System.Threading.Timeout.Infinite);
[...]
// In the callback of the asynchronous socket operations
lock (this) {
    t.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
    if (!timeout) {
        // Perform work
    }
}

这也可以处理由简单延迟产生的超时情况,如果操作花费太多时间,则允许回调立即返回。

我为我的项目sharpLightFtp解决了这个问题:

创建了一个类,它被注入到system.net.socket.socketasynceventargs实例的UserToken -属性中,并具有System.Threading。AutoResetEvent,用于在ConnectAsync, ReceiveAsyncSendAsync之后接收一个带有超时的信号(如这里:第22行用于获得自定义增强的SocketAsyncEventArgs -instance,第270行用于创建和增强SocketEventArgs -instance,第286行用于发送信号,第30行用于等待)