C# 带有SqlDataReader和取消令牌的IAsyncEnumerable挂起取消

C# 带有SqlDataReader和取消令牌的IAsyncEnumerable挂起取消,c#,.net-core,ado.net,.net-core-3.0,iasyncenumerable,C#,.net Core,Ado.net,.net Core 3.0,Iasyncenumerable,我试图在c#8中测试新的IAsyncEnumerable功能(以及.NETCore3WinForm预览版),但当我试图取消任务时,一切似乎都被捆绑住了。在reader.ReadAsync中暂停调试器,然后继续循环,可以使一切正常运行。在while之前添加线程。Sleep(0)有时似乎也有帮助,但并不一致 我曾经尝试过大量地使用.configurewait(false)来查看这是否有帮助,但没有 我的代码有什么问题吗?或者SqlClient.*与异步枚举的关系还不太好 专用异步IAsyncEnum

我试图在c#8中测试新的IAsyncEnumerable功能(以及.NETCore3WinForm预览版),但当我试图取消任务时,一切似乎都被捆绑住了。在
reader.ReadAsync
中暂停调试器,然后继续循环,可以使一切正常运行。在
while
之前添加
线程。Sleep(0)
有时似乎也有帮助,但并不一致

我曾经尝试过大量地使用
.configurewait(false)
来查看这是否有帮助,但没有

我的代码有什么问题吗?或者SqlClient.*与异步枚举的关系还不太好

专用异步IAsyncEnumerable SearchUIDataAsync(字符串searchTerm,CancellationToken CancellationToken)
{
使用var con=newsqlconnection(_connectionString);
使用var cmd=new SqlCommand(querys.UIDataSearch,con){
CommandTimeout=0
};
cmd.Parameters.AddWithValue(“@searchTerm”,searchTerm);
等待con.OpenAsync(取消令牌);
使用var reader=wait cmd.ExecuteReaderAsync(cancellationToken);
如果(!reader.HasRows)
{
屈服断裂;
}
while(等待reader.ReadAsync(cancellationToken))
{
回传阅读器;
}
}
此代码称为WinForm按钮单击事件,如下所示

if(查询运行)
{
cts.Cancel();
返回;
}
尝试
{
等待foreach(SearchUIDataAsync(formDataSearchTerm.Text,cts.Token)中的var dr。带取消(cts.Token))
{
//...
}
}
catch(TaskCanceledException){}

对于上下文
cts
是表单上的
CancellationTokenSource
字段

我不是100%确定,但是对于其他上下文,似乎在我的
SearchUIDataAsync
方法中处理
TaskCanceledException
解决了死锁。我在.NET Core 3.1中也遇到了同样的问题。我发现在生成器方法的循环体中有一个异常。Visual Studio没有引发异常,我认为这是一个死锁。我不是100%确定,但对于其他上下文,似乎在我的
SearchUIDataAsync
方法中处理
TaskCanceledException
s解决了死锁。我在.NET Core 3.1中也遇到了同样的问题。我发现在生成器方法的循环体中有一个异常。VisualStudio没有引发异常,我认为这是一个死锁。