Вызов ExecuteReaderAsync — веб-приложение зависает

Я пытаюсь изменить существующий вызов базы данных, чтобы он выполнял асинхронные вызовы базы данных. Это мой первый набег на асинхронные вызовы базы данных, поэтому я просмотрел это сообщение, это сообщение и первые два раздела эту статью MSDN. Это код, который я придумал, он похож на тот, что найден во втором ответе второго сообщения:

public async Task<IEnumerable<Item>> GetDataAsync(int id)
{
    using (SqlConnection conn = new SqlConnection(oCSB.ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand("stored_procedure", conn))
        {
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("param", "value");

            await conn.OpenAsync();
            SqlDataReader reader = await cmd.ExecuteReaderAsync();
            return ReadItems(reader, id).ToList();
        }
    }
}

private IEnumerable<Item> ReadItems(SqlDataReader reader, long id)
{
    while (reader.Read())
    {
        var item = new Item(id);        
        yield return item;
    }
}

Приложение представляет собой приложение веб-форм, и вызов инициируется запросом jQuery ajax к статическому WebMethod на странице aspx, который затем вызывает метод GetDataAsync. К сожалению, приложение зависает при вызове cmd.ExecuteReaderAsync без каких-либо исключений, и я не смог понять, почему. Я запускал его как на сервере VS dev, так и на своем локальном IIS 8, но получаю тот же результат. Я также попытался изменить его так, чтобы он делал очень простой выбор в таблице. Я также пытался изменить код на основе других сообщений, с которыми я столкнулся либо в MSDN, либо в SO. Кто-нибудь знает, что может быть причиной зависания при вызове ExecuteReaderAsync?


person dotnetesse    schedule 28.07.2014    source источник
comment
.NET-версия? настройка совместимости контекста синхронизации? Или вы где-то звоните в Result или Wait?   -  person usr    schedule 29.07.2014
comment
Как вы звоните GetDataAsync()?   -  person DavidG    schedule 29.07.2014
comment
@usr и DavidG, извините за это. Это .Net 4.5. Я не уверен, к чему относится параметр совместимости контекста синхронизации. Я вызываю Result в WebMethod: return obj.GetDataAsync(id).Result;   -  person dotnetesse    schedule 29.07.2014
comment
Тогда классический тупик. Почему вы используете асинхронность, когда ждете результата с помощью Result? Не имеет смысла. Либо синхронный, либо асинхронный. Не ожидание асинхронности.   -  person usr    schedule 29.07.2014
comment
@usr, я думаю, что здесь я использую неправильный подход. Я намерен ускорить поиск и итерацию записей. У нас есть сценарии, в которых мы извлекаем более 10 000 записей, а затем прокручиваем объект считывателя для создания объектов Item.   -  person dotnetesse    schedule 29.07.2014
comment
Итак, вы надеетесь получить параллелизм? Тем не менее, вы ожидаете, что все асинхронные операции убивают параллелизм. Вероятно, концептуальная проблема с вашим пониманием асинхронных вещей.   -  person usr    schedule 29.07.2014
comment
Асинхронно не значит быстрее. Первое, что нужно проверить, — можете ли вы фильтровать или разбивать результаты на страницы (> 10 КБ — это много). Если нет, рассмотрите возможность сегментирования базы данных. Кэширование также всегда возможно.   -  person Stephen Cleary    schedule 29.07.2014
comment
@usr, я думаю, ты прав. Благодарю за разъяснение.   -  person dotnetesse    schedule 29.07.2014
comment
@StephenCleary, спасибо за советы. Я продолжу изучать это.   -  person dotnetesse    schedule 29.07.2014