2011-06-20 43 views
2

在Silverlight中,说,我们启动一个异步请求:在Silverlight中实现异步超时?

var request = WebRequest.Create(uri); 

,然后等待通过委托的响应

request.BeginGetResponse(getResponseResult => ... 

我们如何超时此waitee,提供超时错误信号而不是代表?使用计时器? (注意:.net框架中的可用超时选项在Silverlight版本中缺失)。

要处理同时到达的两条消息,我们可以引入一个Guid过滤器,然后在传递给代理的时候忽略第二条消息。或者反过来(更好),我们注册一个即将到期的Guid,这样委托人可以丢弃第二条消息 - 至少可以进行一些垃圾回收(尽管委托的内存占用量已经很小)。

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


我的查询热线将是实现一个计时器,通知回调,然后莫名其妙取消request.BeginGetResponse等待委托(...)。

注:

  • 虽然的.NET Framework 4的工作对实现WebRequest类超时,Silverlight的版本没有。

  • “System.Threading.Task.Wait方法(时间跨度)”不可用或者

问题1:有没有实施超时错误,以相同的委托目标更好的办法?

问题2:要取消等待委托,是否足够使用“request.BeginGetResponse(null)”?问题3:未执行委托(例如getResponseResult => ...)会导致内存泄漏吗?这只是一个小问题吗?创建一个定时器


信息:

一些参考:

+0

也许我重新发现一个问题。这些人认为这是基础课程所不能做到的。 2009年的问题不会少。请参阅:http://forums.silverlight.net/forums/p/74867/177780.aspx – sgtz

+0

将委托放置在一个包装中,在ThreadPool中听起来像一个坏主意。 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/6632f5f9-b650-4f16-9e8a-1a37de4970e0 – sgtz

回答

2

如果您想给反应式扩展一个尝试,你会得到时间支持廉价。与Rx它会看起来像这样(不精确的代码):

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

我还没有探索过Rx。这看起来很有希望。这是主页。 http://msdn.microsoft.com/en-us/data/gg577609 – sgtz

+0

谢谢你的提示。在这个空间里有很多好东西。 http://blog.paulbetts.org/index.php/2011/01/15/reactivexaml-is-now-reactiveui-2-0/ – sgtz

+0

是的。反应式扩展非常棒:) – Denis