在 Silverlight 中实现异步超时?

发布于 2024-11-16 01:27:09 字数 2881 浏览 0 评论 0 原文

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

var request = WebRequest.Create(uri);

然后通过委托等待响应,

request.BeginGetResponse(getResponseResult => ...

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

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

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


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

注意:

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

  • “System.Threading.Task.Wait Method (TimeSpan)”也不可用

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

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

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


有关创建计时器的信息:

一些参考:

In Silverlight, say we start an async request:

var request = WebRequest.Create(uri);

and then wait for a response via a delegate

request.BeginGetResponse(getResponseResult => ...

How do we timeout this waitee, to deliver a time-out error signal to the delegate instead? Use a timer? (note: timeout options available in the .net framework are missing in the Silverlight version).

To handle two messages arriving at the same time, we could introduce a Guid filter, and then ignore a 2nd message when/if it was delivered to the delegate. Or in reverse (better), we register an expiring Guid so that the delegate can discard a second message -- at least some garbage collection is possible then (although the memory footprint of a delegate has got to be on the small side).

What follows are some notes I've made. I haven't reached a conclusion yet. Any help much appreciated.


My line of enquiry was going to be to implement a timer, notify the callback, and then somehow cancel waiting delegate in request.BeginGetResponse(...).

Note:

  • While the .Net Frame Work 4 implements a timeout on the WebRequest class, the Silverlight version does not.

  • "System.Threading.Task.Wait Method (TimeSpan)" is not available either

QUESTION 1: is there a better way to implement a timeout error to the same delegate target?

QUESTION 2: To cancel the waiting delegate, is it sufficient to use "request.BeginGetResponse(null)"?

QUESTION 3: will a non executed delegate (e.g. getResponseResult => ...) cause a small memory leak? Is this just a minor concern?


Information on creating a timer:

Some References:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

撩动你心 2024-11-23 01:27:09

如果您想尝试一下反应式扩展,您将以低廉的价格获得超时支持。使用 Rx 时,它看起来像这样(不是确切的代码):

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

If you feel like giving reactive extensions a try you will get time out support for cheap. With Rx it will look something like this (not exact code):

var obsrv = Observable.FromAsyncPattern<...>(Begin..., End...);
obsrv(...).Timeout(new TimeSpan(0,0,5)).Subscribe(() => DoThings());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文