我在Silverlight应用程序中使用Socket
来将数据从服务器传输到客户端。
但是,我不太确定如何在Silverlight Socket
中处理超时
在文档中,我看不到类似于ReceiveTimeout
的Silverlight。
答案 0 :(得分:5)
我已经检查了Reflector中的Socket类,并且没有一个相关的setsockopt调用处理超时 - 除了Dispose方法。看起来Silverlight只依赖于WinSock API的默认超时。
Socket类还包含一个私有的“SetSocketOption”方法,您可以通过反射调用它 - 尽管很可能会遇到安全异常。
答案 1 :(得分:4)
由于我找不到任何好的解决方案,我通过创建一个代码类似于以下代码的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
}
}
这也处理由简单延迟产生超时的情况,并且如果操作花费太多时间,则允许回调立即返回。
答案 2 :(得分:0)
我为我的项目sharpLightFtp解决了这个问题,如:
创建了一个class,它注入了UserToken
实例的System.Net.Sockets.SocketAsyncEventArgs - 属性,并且有System.Threading.AutoResetEvent,用于在{{{{}}之后接收信号3}},ConnectAsync
和ReceiveAsync
超时(如SendAsync
:第22行,用于获取自定义增强型SocketAsyncEventArgs
- 实例,第270行,用于创建和增强{{ 1}} - 实例,第286行用于发送信号,第30行用于等待)