2014-01-26 116 views
1

我有以下情況: 我正在調用我的控制器的索引函數,控制器爲了生成它傳遞給視圖的模型必須調用一些Web服務來獲取這裏的數據是代碼(沒有實名):MVC4緩慢加載我該怎麼辦?

public ActionResult Index() 
    { 

     var viewModel = new SomeViewModel(); 

     viewModel.SomeData1=wcfProxy.Function1(); 
     viewModel.SomeData2=wcfProxy.Function2(); 
     viewModel.SomeData3=wcfProxy.Function3(); 

     return View(viewModel); 
    } 

我的問題是,它是花了很長一段時間沒有並行看得到頁面內容在此屏幕截圖:

slowLoading

你可以看到了14.5秒直到它開始與併發連接並行加載腳本。 這真的很煩人!我怎樣才能縮短加載時間?

+0

首先你每次評論一個函數調用一個函數,看看其中一個函數是否會影響性能問題。 –

+0

我的意思是腳本將在wcf調用發生時加載... wcf可以花時間 –

+0

因此,從Web服務獲取數據需要將近15秒,對吧? – Fedor

回答

2

我們不知道。到目前爲止,您尚未向我們展示任何代碼,只有一些泛型方法調用。你要麼必須optimize the WCF methods,所以他們不需要15s(最好的解決方案,因爲15s真的很荒謬),或者至少讓你的邏輯parallel/async(例如使用ajax)。

這是在C#中一個很好的鏈接,並行編程和.NET4 http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx

主要的想法是開始加載數據,而無需等待前一個方法調用。目前你的函數function2和function3等待之前的函數完成。如果你平行打電話,最後的時間會縮短。這就像是用桶清空管子一樣。更多水桶同時取水,過程更快。

隨着網站開發,你也可以使用ajax。基本的想法是將頁面發送到客戶端而不使用這些數據,等待頁面加載,然後使用ajax異步加載內容(不要忘記通知客戶端數據仍在加載)。

例如jQuery的這是偉大的:http://api.jquery.com/jquery.ajax/

+0

你可以擴大並行/異步我認爲這是我正在尋找...我想提到,我使用visual studio 2010 .... –

+1

@ilayzeidman,在這裏你去:) – walther

1

您寫道:

沒有得到並行

頁面內容你不應該那麼只需讓你的代碼的並行?例如。通過使用支持TPL的異步/等待關鍵字?否則,每次對WCF的調用都將一直運行。

+0

我的意思是腳本將在wcf調用發生的時候加載...... –

+2

但是現在,在您的代碼中,它們都在一個線程上運行,所以毫無疑問腳本在wcf調用之後加載。 wcf調用應該最好與主線程分開。否則,您將不得不首先等待所有呼叫的結果,然後纔開始生成視圖。也許你可以例如用Html.Action調用每個人?或者從javascript觸發並在收到一定結果後更新視圖? –

+0

你能寫我怎麼可以從javascript這是我正在尋找.... –

2

最好的選擇可能只是用了返回數據的視圖,然後讓頁面載入「慢」數據異步使用Ajax調用。

所以,你的控制器將是這個樣子:

public ActionResult Index() 
{ 

    var viewModel = new SomeViewModel(); 

    return View(viewModel); 
} 

public ActionResult DataOne() 
{ 
    var data =wcfProxy.Function1(); 
    return JSON(data,, JsonRequestBehavior.AllowGet); 
} 
... 

然後,您應該能夠使用JavaScript來檢索和顯示數據。下面的例子使用JQUery庫。

$.get("/ControllerName/DataOne").done(function (data) { 
     //display data. 
}); 

jQuery的文檔,可以發現JQuery Docs,是真正有用的,有很多的例子。