在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 => ...)是否会导致内存泄漏?这只是一个小问题吗?
有关创建计时器的信息:
System.Windows.Threading.DispatcherTimer
http://blog.bodurov.com/How-to-Create-setTimeout-Function-in-Silverlight
一些参考文献:
http://blog.bodurov.com/How-to-Create-setTimeout-Function-in-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(一些很好的信息。仍然没有找到如何处理无限等待的代表)。
答案 0 :(得分:2)
如果你想尝试一下反应性扩展,那么你将获得廉价的支持。使用Rx,它看起来像这样(不是确切的代码):
var obsrv = Observable.FromAsyncPattern<...>(Begin..., End...);
obsrv(...).Timeout(new TimeSpan(0,0,5)).Subscribe(() => DoThings());