2011-06-20 40 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