Silverlight Sockets中的超时
本文关键字:超时 Sockets Silverlight | 更新日期: 2023-09-27 17:53:36
我在Silverlight应用程序中使用Socket
s从服务器流数据到客户端。
然而,我不太确定如何在Silverlight Socket
中处理超时。
在文档中,我看不到任何像ReceiveTimeout
的Silverlight。
- 用户定义的超时是否可能?我怎么设置它们?当发送/接收操作超时时,我如何获得通知?
- 是否有默认超时?它们有多大?
- 如果没有超时:手动实现这些超时的最简单方法是什么?
我已经检查了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
, ReceiveAsync
和SendAsync
之后接收一个带有超时的信号(如这里:第22行用于获得自定义增强的SocketAsyncEventArgs
-instance,第270行用于创建和增强SocketEventArgs
-instance,第286行用于发送信号,第30行用于等待)