Member 8003277 Ответов: 2

Асинхронность C# с SQL-запросом


Почему код не работает в асинхронном режиме?
Если я удалю // из предложения "система.Нарезание резьбы.Нить.Sleep(10000);", в интервале 10 секунд форма отвечает Хорошо, но при подключении к базе данных sql все блоки приложения!
Есть ли другой способ выполнения sql-запросов в асинхронном режиме?

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

public Task<datatable> LoadData1()
        {
            return Task.Run(() => {
                using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["svfscamBD"].ConnectionString))
                {
                    //System.Threading.Thread.Sleep(10000);
                    sqlCon.Open();
                    SqlCommand cmd = new SqlCommand("spViewProdDesenfDia", sqlCon);
                    DataTable myDataTable = new DataTable();
                    myDataTable.Load(cmd.ExecuteReader());
                    return myDataTable;
                }
            });
        }

        private async void butAtualizar_Click(object sender, EventArgs e)
        {
            dgridProdD.DataSource = await LoadData1();
        }

MadMyche

Вы читали эту статью:
https://www.codeproject.com/Articles/1121822/Using-Async-Await-Task-Methods-With-SQL-Queries-NE

2 Ответов

Рейтинг:
2

RickZeeland

Может быть, вы можете попробовать демо-версию этой статьи CodeProject и посмотреть, работает ли это: Использование методов задачи Async/Await с SQL-запросами .NET 4.5 [^]


Рейтинг:
0

Richard Deeming

Попробуйте что-нибудь вроде этого:

public async Task<DataTable> LoadData1()
{
    // Force the execution off the UI thread:
    await Task.Yield().ConfigureAwait(false);
    
    // Use Task.Delay instead of Thread.Sleep:
    // await Task.Delay(10000);
    
    using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["svfscamBD"].ConnectionString))
    {
        await sqlCon.OpenAsync();
        
        using (SqlCommand cmd = new SqlCommand("spViewProdDesenfDia", sqlCon))
        using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
        {
            DataTable myDataTable = new DataTable();
            myDataTable.Load(reader);
            return myDataTable;
        }
    }
}

private async void butAtualizar_Click(object sender, EventArgs e)
{
    butAtualizar.Enabled = false;
    try
    {
        dgridProdD.DataSource = await LoadData1();
    }
    finally
    {
        butAtualizar.Enabled = true;
    }
}


Member 8003277

Ни один из ответов не работает нормально.
Спасибо

Richard Deeming

Все ответы работают нормально. Если вы хотите получить дополнительную помощь, вам нужно будет объяснить, что вы имеете в виду.