在Silverlight中实现异步超时?

时间:2011-06-20 13:25:20

标签: silverlight asynchronous delegates timeout

在Silverlight中,假设我们启动异步请求:

var request = WebRequest.Create(uri);

然后通过代理等待回复

request.BeginGetResponse(getResponseResult => ...

我们如何暂停此服务员,向代表发送超时错误信号?使用计时器? (注意:Silverlight版本中缺少.net框架中可用的超时选项)。

要处理同时到达的两条消息,我们可以引入一个Guid过滤器,然后在/如果它被传递给委托时忽略第二条消息。或者反过来(更好),我们注册一个过期的Guid,以便委托可以丢弃第二条消息 - 至少可以进行一些垃圾收集(尽管代表的内存占用量必须偏小)。 / p>

以下是我所做的一些笔记。我还没有得出结论。任何帮助非常感谢。


我的调查工作是实现一个计时器,通知回调,然后以某种方式取消请求中的等待委托.BeginGetResponse(...)。

注意:

  • 虽然.Net Frame Work 4在WebRequest类上实现了超时,但Silverlight版本却没有。

  • “System.Threading.Task.Wait Method(TimeSpan)”无法使用

  

问题1:有没有更好的方法来为同一个委托目标实现超时错误?

     

问题2:要取消等待委托,是否足以使用“request.BeginGetResponse(null)”?

     

问题3:未执行的委托(例如getResponseResult => ...)是否会导致内存泄漏?这只是一个小问题吗?


有关创建计时器的信息:

一些参考文献:

1 个答案:

答案 0 :(得分:2)

如果你想尝试一下反应性扩展,那么你将获得廉价的支持。使用Rx,它看起来像这样(不是确切的代码):

var obsrv = Observable.FromAsyncPattern<...>(Begin..., End...);
obsrv(...).Timeout(new TimeSpan(0,0,5)).Subscribe(() => DoThings());