3

我目前開始一個小項目,展現了JS和HTML5的世界。如何在MVC中處理耗時的serverside初始化?

我幾個月前已經試過了,但是我停了下來,因爲我沒有足夠的時間從頭開始創建一個MVC單頁面應用程序。有太多的概念和模式需要理解,我會後悔在日常工作中缺乏所有這些知識。 使用它或失去它!

昨天我剛剛在約翰帕帕的博客上發現了this post,我覺得這將是一個很好的開始。基本上它是一個MVC模板,名爲HotTowel,它實現了很好的概念,如數據綁定,縮小等等。只要我需要,我就會體驗到代碼,只要我需要,就會進一步體驗它。

我想構建一個應用程序來從我的作品現有數據模型項目中獲取數據。在我們的Silverlight應用程序中,我們通過預加載和初始化字典和其他屬性來啓動它,並調用異步Init()方法(例如,用於下載包含自定義代碼的XML文件並將它們放入字典中)。 MEF用於擺脫不方便的依賴關係。

據我所知,服務器端初始化必須在Global.asax文件中的Application_Start()方法中完成。我想知道如何在這種方法中等待異步調用?最佳做法是什麼?我在客戶端的查詢很大程度上依賴於這些類進行初始化。有什麼選擇?

我的想法是以下幾點:

  • Application_Start()火災和忘記了異步初始化過程。如果我在初始化完成之前執行一個請求(在控制器上,我猜),我不得不等待初始化過程的回調,並在它到達時立即開始查詢。這樣做的好處是,初始化可以運行,而用戶可以通過應用程序進行導航。
  • 我會實施某種惰性初始化。我會盡快處理初始化請求的初始化。不過,這可能需要很長時間。
  • 我會在Application_Start()中同步運行初始化過程。我目前看到的主要缺點是,瀏覽器窗口似乎凍結給用戶。如果可以讓用戶跟蹤當前的初始化狀態(某種啓動畫面),我會對此解決方案感到滿意。

雖然我不知道他們中的任何一個人會如何工作,並會很高興如果你們中的任何一位能夠給我一些建議,以告訴我如何以及從哪裏開始。

回答

4

您可以使用Task<MyDataModel>來表示數據。

static Task<MyDataModel> dataTask; 
public static Task<MyDataModel> LoadDataModelAsync() 
{ 
    var ret = new MyDataModel(); 
    await ret.Init(); 
    return ret; 
} 

開始它在Application_Start(或靜態構造函數):

dataTask = LoadDataModelAsync(); 

然後每個動作需要它可以await它完成:

MyDataModel data = await dataTask; 
... 

如果它是已經完成,await將檢測到並繼續(同步)。

相關問題