【发布时间】:2023-03-13 14:26:01
【问题描述】:
我正在尝试将 CancellationToken 与 SqlConnection.OpenAsync() 一起使用来限制 OpenAsync 函数所花费的时间。
我创建了一个新的 CancellationToken 并将其设置为在 200 毫秒后取消。然后我将它传递给 OpenAsync(token)。但是,此功能仍可能需要几秒钟才能运行。
查看文档我真的看不出我做错了什么。 https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.openasync?view=netframework-4.7.2
这是我正在使用的代码:
private async void btnTestConnection_Click(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(SQLConnectionString);
Task.Run(() => QuickConnectionTest(connection)).Wait();
}
public async Task QuickConnectionTest(SqlConnection connection)
{
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
source.CancelAfter(200);
ConnectionOK = false;
try
{
using (connection)
{
await connection.OpenAsync(token);
if (connection.State == System.Data.ConnectionState.Open)
{
ConnectionOK = true;
}
}
}
catch (Exception ex)
{
ErrorMessage = ex.ToString();
}
}
当 CancellationToken 在 200 毫秒过去后抛出 OperationCanceledException 时,我希望 OpenAsync() 提前结束,但它只是等待。
为了复制这一点,我执行以下操作:
【问题讨论】:
-
你不是在
OpenAsync之前缺少一个await吗? -
你能有你的真实代码吗?
-
SqlConnection已经内置了超时机制。默认值为 15 秒,使用 Azure 时建议为 30 秒。无论如何,这使得设置亚秒级超时似乎有些不切实际。 -
如果我的帖子不清楚,请致歉。在找不到数据库的最坏情况下,我试图让超时时间小于 1 秒。 Connection.Timeout 不允许少于 1 秒,在测试时我发现测试连接可能需要 10 - 40 毫秒(在本地 PC 上)。
标签: c# asynchronous