2012-05-22 57 views
1

我正在放置一個Silverlight 5應用程序,該應用程序將在瀏覽器外運行,並且在啓動時有一些所有內容。具體來說,以下是我需要遵循的步驟:爲SL5 OOB應用程序實現啓動任務

  1. 檢查應用程序是否用完瀏覽器(如果沒有,則顯示指示用戶在本地安裝它的屏幕)。
  2. 顯示一個「啓動畫面」(如果在剩下的步驟執行時播放動畫會很好)。
  3. 配置MEF
  4. 預加載上下文信息和來自服務器的「靜態」數據(例如設置)。這些數據在任何應用程序邏輯運行之前都是必需的。
  5. 動態加載其他XAP文件,包括外部主題庫。
  6. 將「splash screen」替換爲包含導航框架的外殼。
  7. 導航到應用程序的開始頁面。

我還需要支持應用程序擴展服務(IApplicationService,IApplicationLifetimeAware),所以我實現的任何進程都必須遵守這些服務。這些服務中的大多數都需要配置MEF,所以它們不應在MEF配置和導入滿意之前執行。

另一個考慮因素是,只有在動態XAP文件被引入並且MEF重組後,才能滿足一些導入。

我遇到的一個障礙是事實,我不能做第5步,直到前面的步驟完成。加載XAP文件或異步調用服務器數據允許繼續執行代碼。我需要一種方法來「停止」用戶界面,直到所有構圖完成並且所有需要的上下文數據都已加載完畢。

因此,我正在尋找能夠滿足所有這些要求的推薦方法,並且很樂意提供更多詳細信息,以幫助您獲得可行的解決方案。

UPDATE

我可以給我的困難,最好的解釋是,我必須「釋放」 UI線程來顯示「啓動畫面」,但也暫停,而每一步的應用程序的正常生命週期執行。我不能(也不想)在Application.Start事件處理程序中做所有事情,因爲應用程序服務已經啓動。

另外,釋放UI線程意味着我在後臺工作並讓原始方法(例如Application.Start)返回,運行時將在啓動過程中向前移動。例如,在應用程序服務的啓動方法中啓動後臺進程,然後返回允許運行時在應用程序對象上引發啓動事件。但是如果我需要完成後臺進程才能完成下一步操作,則必須暫停阻止UI的當前線程。

所以我不確定如何劃分工作或放在哪裏(應用程序,應用程序服務,引導程序,工作流程等)。

+0

就這樣嗎?你有什麼嘗試? –

+0

我已經單獨完成了大部分步驟,但沒有完成。我故意沒有涉及到各種實現,因爲我正在尋找其他人已經或將要做的事情,而不是專注於我已經或未完成的事情(特別是因爲我沒有成功地將它們放在一起)。 – SonOfPirate

回答

0

您可以使用ManualResetEvent類強制服務調用爲同步(並保證它們完成的順序)。你也可以使用它來將後臺線程同步到主UI線程。

http://mohundro.com/blog/2006/06/27/a-little-bit-about-manualresetevent/

+0

我的問題是沒有將後臺線程與主UI線程同步。我的問題是UI經歷了一個生命週期(IApplicationService.StartService,IApplicationLifetimeAware.Starting,Application.Start,IApplicationLifetimeAware.Started)。我不希望Application.Start發生,直到在Starting中執行的所有操作都已完成(例如),但是我需要在某個時候刷新UI才能顯示「splash」。 – SonOfPirate

+0

如果我在後臺線程上運行這些操作中的任何一個,UI線程將在整個生命週期中繼續執行,並且我將不會按照確保先前的步驟完成所需的順序發生操作的預期工作流程。 – SonOfPirate

+0

你不能在Silverlight的主UI線程上做到這一點,這是不可能的。 – EkoostikMartin

相關問題