我目前正在使用支持自身和JavaScript之間雙向通信的Silverlight 5應用程序。 Silverlight應用程序負責渲染3D內容,JavaScript負責收集和準備渲染數據。使用異步AJAX時,Silverlight應用程序不會變爲空閒
我面臨的問題是,Silverlight 5 DrawingSurface只在DrawingSurface無效並且應用程序變爲空閒後重新繪製。不幸的是,當使用異步AJAX請求從服務器下載我需要的數據時,DrawingSurface不會重新繪製,直到所有數據都被下載(儘管每次下載數據後都無效DrawingSurface)。
我理解這一點,但讓我困惑的是,當我在Silverlight中使用WebClient完成同樣類型的異步下載請求時,DrawingSurface在大部分失效調用後成功重新繪製。
最初,我認爲這可能是由於一些線程問題,但所有的調用(和回調)在同一個線程上運行。我試過使用jQuery的AJAX API並在JavaScript中編寫我自己的XmlHttpRequest處理程序;但我從兩方面都得到了相同的結果。我最初注意到jQuery以我請求的順序返回數據(而Silverlight的WebClient不是),這導致我創建自己的XmlHttpRequest處理程序,因爲我認爲重新排序可能導致腳本在異步調用期間保持活動狀態。
有沒有人有過這個問題之前和/或沒有人有任何解決方法/修復建議?
我已經試過這樣做了。問題在於InvalidateSurface調用本質上通知DrawingSurface它需要重新繪製,這隻發生在應用程序變爲空閒時。因此,當應用程序變爲空閒時,Draw事件將再次僅在這種情況下被解僱。我目前面臨的是同樣的情況。 – 2011-06-16 09:30:53
你是什麼意思「當應用程序空閒時」?如果我記得的話,silverlight插件會在組合線程上運行繪圖代碼。你的意思是你的UI線程被阻塞了嗎? – Eilistraee 2011-06-17 12:41:47
據我所知,當DrawingSurface.Invalidate或DrawEventArgs.InvalidateSurface方法被調用時,它們會告訴DrawingSurface重新觸發Draw事件。但爲了使其更有效率,它將無效請求排隊,直到它將當前流程視爲已完成(或在我的問題/評論的上下文中空閒),並在此時觸發事件。 [...] – 2011-06-20 11:43:33