SrikantSahu Ответов: 1

Как вызвать асинхронный запрос в EF 6.0


Я пытаюсь привязать gridview с помощью необработанного Sql-запроса EF 6.0 с асинхронностью, но система продолжает бесконечное выполнение и task.Result никогда не заполняется.

Что я уже пробовал:

protected void Page_Load(object sender, EventArgs e)
    {
        var task = LoadDataAsync();
        task.Wait();
        var data = task.Result;
        GridView1.DataSource = data;
        GridView1.DataBind();
    }

private async Task<list<user>> LoadDataAsync()
    {
        List<user> users = null;
        using (var context = new BlogEntities())
        {
            users = await context.Users.SqlQuery("Select * from [User]").ToListAsync();
        }

        return users;

    }

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

1 Ответов

Рейтинг:
11

Dave Kreskowiak

Ваш код, по сути, однопоточный. У вас есть 2 потока, но один полностью заблокирован, ожидая другого. В любом случае, размещение кода LoadData в фоновом потоке, поскольку это единственное, что вы делаете, ничем не отличается от того, как если бы вы полностью пропустили все задачи/асинхронность/ожидание. Вы не получите никакого преимущества в производительности, продевая эту нить.

Но, чтобы немного упростить ситуацию, вы можете попробовать сделать это таким образом:

protected async void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack())
    {
        var result = await LoadDataAsync();
        GridView1.DataSource = result;
        GridView1.DataBind();
    }
}

protected Task<list<user>> LoadDataAsync()
{
    return Task.Factory.StartNew<list<user>>(() =>
    {
        using (var context = new BlogEntities())
        {
            users = context.Users.SqlQuery("SELECT * FROM [User]").ToList();
        }
    }
}


SrikantSahu

Спасибо, Дэйв, это работает. Вы правы, нет никакого смысла создавать здесь поток, но я просто хотел попробовать асинхронность с необработанным sql-запросом. Просто хотел, чтобы вы знали, что, поставив await перед LoadDataAsync() и пометив page_load как асинхронный в моем оригинальном решении, также сработало.