2016-01-04 4 views
4

У меня есть метод действий, который вставляет некоторые данные в базу данных. Я пытаюсь сделать его асинхронным. Код выглядит следующим образом: метод вставкаАсинхронные методы действия с синхронными вызовами API

public async Task<ActionResult> Create([DataSourceRequest] DataSourceRequest request, MyClass model) 
{ 
    return await Task.Run(() => 
    { 
     if (model != null && ModelState.IsValid) 
     { 
      try 
      { 
       repository.Insert(model); 

       anotherSyncCall(model); 
      } 
      catch { ModelState.AddModelError("", "Error"); } 
     } 

     return Json(new[] { model }.ToDataSourceResult(request, ModelState)); 
    }); 
} 

Repository является синхронным, я должен сделать это асинхронно, чтобы сделать этот метод действий асинхронным?

Repository Код вставки:

private EFDbContext context; 
public Repository() 
{ 
    context = new EFDbContext(Authentication.GetConnectionClaim); 
} 
//...... 
public void Insert(T entity) 
{ 
    context.Set<T>().Add(entity); 
    context.SaveChanges(); 
} 

Эта картина таймингов, при повторных запросах.

enter image description here

Как вы можете видеть, что они работают синхронно. Я уверен, что мои вызовы Ajax на стороне клиента являются асинхронными, потому что все запросы делаются сразу, и они получают ответы со временем.

UPDATE

Это код, который я тестирую мое приложение с:

for (var i = 0; i < 100; i++) { 
     $.ajax({ 
      method: 'post', 
      url: 'http://192.168.1.8/xx/xx/Read', 
      data: 'sort=&page=1&pageSize=10&group=&filter=' 
     }); 
    } 

И я попытался установить SessionState в Readonly как предложено @Dan но идентификатор не изменился таймингов.

enter image description here

На второй мысли, может быть, это ToDataSourceResult метод расширения Кендо UI, который вызывает эту проблему? Но я делаю разные Task для этого action method в любом случае.

+0

Возможно, стоит опубликовать код на стороне клиента. –

+0

Для этого теста это простой вызов JQuery Ajax в цикле! Но для функциональности я использую Kendo Grid (для этого вы не написали пользовательские призы Ajax). – Akbari

+0

Что такое 'repo'? Как выглядит код, все должно быть асинхронным, как есть. Но я думаю, что 'repo.Insert' выполняет некоторую синхронизацию, которая приводит к наблюдаемому времени. –

ответ

2

Вы пытались настроить SessionState на ReadOnly? Это может быть сделано на контроллере с:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 

Согласно Microsoft:

Доступ к ASP.NET состоянию сеанса исключительно на сессию, что означает, что если два разных пользователей сделать одновременные запросы, доступ к каждому отдельному сеансу предоставляется одновременно. Однако, если два одновременных запроса сделаны для одного и того же сеанса (с использованием того же значения SessionID), первый запрос получает эксклюзивный доступ к информации о сеансе. Второй запрос выполняется только после завершения первого запроса. (Второй сеанс также может получить доступ, если исключительная блокировка информации освобождается, потому что первый запрос превышает тайм-аут блокировки.) Если значение EnableSessionState в директиве @ страницы установлено в ReadOnly, запрос для чтения только для чтения информация сеанса не приводит к исключительной блокировке данных сеанса. Тем не менее, запросы только для чтения для данных сеанса могут по-прежнему ждать блокировки, установленной с помощью запроса на чтение и запись для очистки данных сеанса.

1

Использование Task.Run в синхронном методе по своей природе не означает, что ваш код будет работать быстрее. Скорее всего, вы блокируете реакцию сервера (как показано на фотографиях). Сервер не может обрабатывать все эти запросы одновременно, поэтому вы становитесь выше поведения. Если ваше намерение является неблокирующим поведением на стороне клиента. Вы должны вызвать этот синхронный метод, используя ajax со стороны клиента, чтобы пользователь не замерзал.Если вы хотите погрузиться в async/await на стороне сервера, в основном используется для приложений с ограниченным количеством пользователей, я рекомендую вам этот слайд Stephen Cleary Conference, а также чтение его блога.