ASP.NET MVC 4 асинхронный вызов базы данных: никогда не возвращает ответ HTTP - PullRequest
2 голосов
/ 03 апреля 2012

Я попытался сделать асинхронный вызов базы данных SQL Server и использовать его вместе с новыми асинхронными функциями ASP.NET MVC 4, но он странным образом не возвращается вообще.Я отладил код, работает хорошо, но как-то HTTP-запрос навсегда остается открытым.

Вот что я сделал:

Это метод вызова базы данных:

public async Task<IEnumerable<Car>> GetCarsAsync() {

    var connectionString = ConfigurationManager.ConnectionStrings["CarGalleryConnStr"].ConnectionString;
    var asyncConnectionString = new SqlConnectionStringBuilder(connectionString) {
        AsynchronousProcessing = true
    }.ToString();

    using (var conn = new SqlConnection(asyncConnectionString)) {
        using (var cmd = new SqlCommand()) {

            cmd.Connection = conn;
            cmd.CommandText = selectStatement;
            cmd.CommandType = CommandType.Text;

            conn.Open();

            using (var reader = await cmd.ExecuteReaderAsync()) {

                return reader.Select(r => carBuilder(r)).ToList();
            }
        }
    }
}

Здесь, Select метод на SqlDataReader - это метод расширения, который яреализованы.carBuilder закрытый метод просто возвращает обратно экземпляр Car класса.

Это класс контроллера:

public class HomeController : Controller {

    private readonly GalleryContext ctx = new GalleryContext();

    public async Task<ViewResult> IndexAsync() {

        return View("Index", await ctx.GetCarsAsync());
    }
}

Есть идеи, что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Ваш контроллер по-прежнему должен быть производным от AsyncController (см. Упражнение 4: Использование асинхронных контроллеров ), но теперь вам нужно написать меньше кода для достижения того же результата с Task<T> .

Так что это должно работать:

public class HomeController : AsyncController {

    private readonly GalleryContext ctx = new GalleryContext();

    public async Task<ViewResult> IndexAsync() {

        return View("Index", await ctx.GetCarsAsync());
    }
}
2 голосов
/ 03 апреля 2012

В MVC 4 Beta есть ошибка, которая вызывает зависание при возврате асинхронного Task, который завершается очень быстро.

Обходной путь - добавить следующую строку в качестве первой строки вашего метода действия:

await Task.Yield();

Не могли бы вы посмотреть, исправит ли это?

Подробнее здесь: http://aspnetwebstack.codeplex.com/workitem/22

...