在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());