2014-01-26 4 views
1

У меня есть следующий сценарий: Я звоню в мой контроллер Функция индекса, контроллер, чтобы сгенерировать модель, которую она передает, должна вызвать некоторые веб-службы для получения данных здесь - это код (без реальных имен):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

Итак, для получения данных из веб-служб требуется почти 15 секунд? – Fedor

ответ

2

Мы не знаем. Пока вы пока не показали нам никакого кода, только куча каких-то общих вызовов методов. У вас либо есть optimize the WCF methods, поэтому они не занимают 15 секунд (лучшее решение, потому что 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

Вы писали:

без получения содержимого страницы в параллельном

Если вы не то просто сделать свой код параллельно? Например. используя ключевые слова async/await с поддержкой 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, действительно полезен и имеет много примеров.

Смежные вопросы