Вы не можете изменить пользовательский интерфейс из фонового потока. Все поддерживаемые версии .NET позволяют использовать async/await
для выполнения чего-либо в фоновом режиме и возврата в поток пользовательского интерфейса.
ADO.NET, Entity Framework, Dapper и большинство ORM поддерживают асинхронное выполнение. Например, ADO.NET ExecuteReader
имеет эквивалентный ExecuteReaderAsync
метод. EF ToList()
имеет ToListAsync()
. Dapper's Query
имеет QueryAsync
Вы должны изменить свой обработчик событий на что-то вроде этого:
private async void btn1_Click(object sender, RoutedEventArgs e)
{
using(var connection = new SqlConnection(_cnString)
{
IsRefreshing = true;
await connection.OpenAsync();
var results=await connection.QueryAsync<Value>(query);
//We're now back in the UI thread
_theCollection.AddRange(results);
IsRefreshing = false;
}
}
Когда вызываются OpenAsync
или QueryAsync
, .NET запускает запрос в фоновом режиме и освобождает текущий поток (UI). По завершении запроса await
гарантирует, что выполнение возобновится в исходном потоке, то есть в потоке пользовательского интерфейса.