2014-01-09 2 views
0

В моем проекте ASP.Net MVC4 у ​​меня есть метод, который сохраняет введенные пользователем данные. И как только сохранение будет выполнено, страница будет перезагружена новыми значениями.Лучшая практика для разделения большой задачи в ASP.net MVC

Однако в новом требовании у нас есть много времени для восстановления индекса для функциональности поиска, которая будет добавляться, когда пользователь сохраняет данные. Хотя нам удалось добиться этого, перестройка - трудоемкая задача. Следовательно, пользователю нужно подождать значительное количество времени, чтобы получить ответное действие назад, чтобы увидеть обновленную страницу.

Так что мне было интересно, есть ли хорошая практика, чтобы разрушить этот проект. Как и раньше, элемент управления должен возвращаться пользователю, как только данные будут сохранены в БД. Хотя восстановление должно происходить на фоне.

Предыдущий прототип функции.

function saveData() 
{ 
    //Do Saving 
    Return Success 
} 

Текущая функция

function saveData() 
    { 
     //Do Saving 
     // Rebuild Index 
     Return Success 
    } 

Теперь я могу вернуть успех прежде, чем восстановление, а также мне нужно сделать восстановление на заднем конце.

Один из способов, по нашему мнению, состоял в том, что, поскольку мы находимся в Azure, мы можем создать рабочую роль для запуска этого небольшого интервала. Однако это большие накладные расходы, так как мы не можем периодически обновлять профиль своих пользователей. Но когда они это делают, они должны бежать.

Можно ли использовать любую встроенную функцию или архитектуру ASp.net/C# для достижения этой цели? Asynchronusly?

+0

Чтобы быть честным, лучше всего практика должна диктовать, что вы не должны перестраивать индексы каждый раз, когда запись обновляется. –

+0

Спасибо Moo. Поскольку мы используем Lucine Search, индекс необходимо перестроить, чтобы получить новые изменения, затронутые в функциональности поиска. – TBA

+0

Вы не можете сделать это внутри ASP.NET, потому что вы получите только прерывания потока, пока не дождитесь завершения потока. Конечно, это было бы почти бесполезно. Я предлагаю создать службу Windows, которая слушает очередь MSMQ и отбрасывает сообщения в очередь из веб-приложения. –

ответ

2

Я не думаю, что вам нужно постоянно перестраивать индексы lucene, все, что вам нужно сделать, это удалить старый индекс данных и просто добавить новый индекс. При таком подходе он будет быстрым. Фрагмент кода, приведенный ниже -

private static void _addToLuceneIndex(SampleData sampleData, IndexWriter writer) { 
    // remove older index entry 
    var searchQuery = new TermQuery(new Term("Id", sampleData.Id.ToString())); 
    writer.DeleteDocuments(searchQuery); 

    // add new index entry 
    var doc = new Document(); 

    // add lucene fields mapped to db fields 
    doc.Add(new Field("Id", sampleData.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
    doc.Add(new Field("Name", sampleData.Name, Field.Store.YES, Field.Index.ANALYZED)); 
    doc.Add(new Field("Description", sampleData.Description, Field.Store.YES, Field.Index.ANALYZED)); 

    // add entry to index 
    writer.AddDocument(doc); 
} 

реф - http://www.codeproject.com/Articles/320219/Lucene-Net-ultra-fast-search-for-MVC-or-WebForms

+0

Спасибо Рами, за хорошее предложение. Хотя мы решили проблему, используя Task.Factory.Startnew(). мы будем стремиться реализовать ваши предложения для нашего проекта. – TBA

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