Метод асинхронного ожидания блокирует пользовательский интерфейс в точке ожидания - PullRequest
4 голосов
/ 08 мая 2019

Вот мое событие кнопки:

private async void btnTarget_Click(object sender, EventArgs e)
{
    using (DataBaseDataContext db = new DataBaseDataContext())
    {
        targtGirdView.DataSource = await Task.Run(() =>
        {
            return heavyLinqToSQLQuery;
        });
    }
}

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

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Я только что решил свою проблему, добавив .ToList(); в конце моего запроса LINQ:

private async void btnTarget_Click(object sender, EventArgs e)
{
    using (DataBaseDataContext db = new DataBaseDataContext())
    {
        targtGirdView.DataSource = await Task.Run(() =>
        {
            return heavyLinqToSQLQuery.ToList();
        });
    }
}

Но я понятия не имею, почему он работает правильно, не блокируя пользовательский интерфейс.Связано ли это с ленивой загрузкой или как?

3 голосов
/ 08 мая 2019

Ваш запрос LINQ должен быть асинхронным.И код должен выглядеть примерно так:

private async void btnTarget_Click(object sender, EventArgs e)
{
    using (DataBaseDataContext db = new DataBaseDataContext())
    {
        targtGirdView.DataSource = await heavyLinqToSQLQuery.ToListAsync();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...