Silverlight套接字超时

时间:2011-04-29 10:22:18

标签: c# silverlight sockets timeout

我在Silverlight应用程序中使用Socket来将数据从服务器传输到客户端。

但是,我不太确定如何在Silverlight Socket中处理超时 在文档中,我看不到类似于ReceiveTimeout的Silverlight。

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

3 个答案:

答案 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}},ConnectAsyncReceiveAsync超时(如SendAsync:第22行,用于获取自定义增强型SocketAsyncEventArgs - 实例,第270行,用于创建和增强{{ 1}} - 实例,第286行用于发送信号,第30行用于等待)