在Silverlight中实现异步超时



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

var request = WebRequest.Create(uri);

然后通过代理等待响应

request.BeginGetResponse(getResponseResult => ...

我们如何使这个等待者超时,以向代理传递超时错误信号?使用计时器?(注意:Silverlight版本中缺少.net框架中可用的超时选项)。

为了处理同时到达的两条消息,我们可以引入Guid过滤器,然后在第二条消息传递给代理时忽略它。或者反过来(更好),我们注册一个过期的Guid,这样委托就可以丢弃第二条消息——至少可以进行一些垃圾收集(尽管委托的内存占用必须很小)。

下面是我做的一些笔记。我还没有得出结论。非常感谢您的帮助。


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

注:

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

  • "System.Threading.Task.Wait Method(TimeSpan)";也不可用

问题1:有没有更好的方法可以对同一个代理目标实现超时错误?

问题2:要取消等待的代表,使用";要求BeginGetResponse(null)"?

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


关于创建计时器的信息:

  • System.Windows.Threading.DispatcherTimer

  • http://blog.bodurov.com/How-to-Create-setTimeout-Function-in-Silverlight

一些参考文献:

  • http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.opentimeout(v=VS.95).aspx(似乎与WCF相关)

  • http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.receivetimeout(v=VS.95).aspx(似乎与WCF相关)

  • http://blog.bodurov.com/How-to-Create-setTimeout-Function-in-Silverlight(可能有用)

  • Silverlight,处理异步调用(无新信息)

  • http://petesbloggerama.blogspot.com/2008/07/omg-silverlight-asynchronous-is-evil.html(我想正确地处理Async……我有一些好的技术,但我想确保我干净地使用它们。可能我需要更仔细地研究委托)。

  • http://msdn.microsoft.com/en-us/library/dd460717.aspx#CommunityContent

  • http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html(一些好的信息。仍然没有找到如何处理无限等待的代表)。

如果你想尝试一下响应式扩展,你会得到廉价的超时支持。有了Rx,它会看起来像这样(不是确切的代码):

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

相关内容

  • 没有找到相关文章

最新更新