1

我试图在 c# 8(以及 .NET Core 3 WinForm 预览版)中测试新的 IAsyncEnumerable 功能,但是当我尝试取消任务时,一切似乎都绑定了。在 while 循环上暂停调试器reader.ReadAsync然后继续会导致一切正常运行。Thread.Sleep(0)在 the 之前添加 awhile有时似乎也有帮助,但并非始终如一。

我曾尝试.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字段

4

0 回答 0