IAsyncEnumerable с SqlDataReader и токен отмены зависает при отмене
Я пытался протестировать новую функцию IAsyncEnumerable в C# 8(а также предварительный просмотр.NET Core 3 WinForm), но все, кажется, связывается, когда я пытаюсь отменить задачу. Приостановка отладчика на reader.ReadAsync
в то время как цикл, продолжая, заставляет все играть хорошо. Добавление Thread.Sleep(0)
как раз перед while
Также, кажется, иногда помогает, но не всегда.
Я пробовал перчить .ConfigureAwait(false)
вокруг, чтобы посмотреть, поможет ли это, но это не так.
Что-то не так с моим кодом или SqlClient.* Просто не подходит для асинхронного перечисления?
private async IAsyncEnumerable<IDataRecord> SearchUIDataAsync(string searchTerm, CancellationToken cancellationToken)
{
using var con = new SqlConnection(_connectionString);
using var cmd = new SqlCommand(Queries.UIDataSearch, con) {
CommandTimeout = 0
};
cmd.Parameters.AddWithValue("@searchTerm", searchTerm);
await con.OpenAsync(cancellationToken);
using var reader = await cmd.ExecuteReaderAsync(cancellationToken);
if (!reader.HasRows)
{
yield break;
}
while (await reader.ReadAsync(cancellationToken))
{
yield return reader;
}
}
Этот код называется формой события нажатия кнопки WinForm, как это
if (queryRunning)
{
cts.Cancel();
return;
}
try
{
await foreach (var dr in SearchUIDataAsync(formDataSearchTerm.Text, cts.Token).WithCancellation(cts.Token))
{
//...
}
}
catch (TaskCanceledException) { }
Для контекста cts
это CancellationTokenSource
поле в форме