C# SqlConnection超时异常
我遇到了一个奇怪的问题,即连接尝试的剩余超时似乎在多次尝试中持续存在 我有一个简单的窗口,其中输入连接信息,带有连接和取消按钮 当用户点击connect时,执行以下代码:C# SqlConnection超时异常,c#,wpf,timeout,async-await,sqlconnection,C#,Wpf,Timeout,Async Await,Sqlconnection,我遇到了一个奇怪的问题,即连接尝试的剩余超时似乎在多次尝试中持续存在 我有一个简单的窗口,其中输入连接信息,带有连接和取消按钮 当用户点击connect时,执行以下代码: DisableControls(); if((bool)AutoAuthenticated.IsChecked) { ((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
DisableControls();
if((bool)AutoAuthenticated.IsChecked)
{
((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
("server="+ServerName.Text + ";"+
"Trusted_Connection=yes;" +
"database="+DatabaseName.Text + ";" +
"connection timeout=3");
}
else
{
((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
("user id="+UserName.Text+";" +
"password="+Password.Password+";" +
"server="+ServerName.Text+";" +
"Trusted_Connection=no;" +
"database="+DatabaseName.Text+";" +
"connection timeout=3");
}
await ConnectToServer();
这是ConnectToServer函数:
private async Task ConnectToServer()
{
//using (((MainWindow)Owner).myConnection)
//{
await ((MainWindow)Owner).myConnection.OpenAsync();
//}
}
出于测试的目的,timeout属性现在很小
无论如何,如果用户在连接时点击取消按钮:
private void Cancel_Click(object sender, RoutedEventArgs e)
{
if (((MainWindow)Owner).myConnection != null &&
((MainWindow)Owner).myConnection.State ==
System.Data.ConnectionState.Connecting)
{
((MainWindow)Owner).myConnection.Close();
EnableControls();
}
else
{
this.Close();
}
}
现在,如果我输入虚假的详细信息并将其保留为超时,那么我将捕获“未找到网络路径”的异常
如果我在这之后再次尝试连接(或者下一次尝试后的连接,具体取决于我点击“取消”按钮的速度),则在点击“连接”按钮后,它几乎会立即超时,而不会等待预期的时间
我不确定我在这里做错了什么,我试着重新设置SqlConnection对象,但我认为每次点击connect时将其设置为新的SqlConnection应该已经这样做了?我发现了我缺少的东西。即使在关闭连接、处理对象、将其保存在using语句中时,问题仍然存在,因为还有另一个我不知道的元素——连接池 我仍然需要对此做一些阅读,但基本上它重用了旧的连接信息等,以节省资源,等等 还有更多信息,但如果这有助于其他人解决类似问题,请在关闭连接时调用
ClearPool()
函数:
示例(在我的异常处理代码中,在调用Close()之后):
显然,从资源使用的角度来看,最好只在不需要重用连接的情况下调用该函数,但也就是说,我仍然需要仔细阅读,所以不要相信我的话 这与异步等待无关,对吗?如果调用SqlConnection.Open()而不是SqlConnection.OpenAsyc,则会发生同样的情况,对吗?您是否知道使用该连接字符串构建代码创建了多少字符串?仅仅使用或将是一个巨大的好处,但是,由于您专门构建了一个SQL连接字符串,所以我使用了
OpenAsync()
,这样应用程序在尝试连接时就不会锁定。我刚刚进行了测试,如果我只使用Open()
,同样的情况也会发生。另外,当你说“你知道你正在创建多少字符串”时,我不确定你说的话会有什么帮助。传入的参数可能会更改,因此无论我如何执行,每次调用此函数时,我都会重新生成字符串。这似乎是在多线程应用程序(如web应用程序)中,仅调用.ClearPool()可能会重置池中仍在其他线程中活动/使用的任何连接。也许最好将打开连接作为一个同步操作,并将等待放在更高的抽象级别上。它只是把任务分成更大的一部分,但我仍然希望以一种不妨碍用户界面的方式来完成它。当我禁用控件时,用户无论如何都不能同时打开多个连接。等待发生在一个事件中(点击连接按钮),所以我不确定我能做到多高?另外,我怎么能同时使用Sqlconnection对象进行其他连接呢?我想我只能对一个…sql连接使用一个Sqlconnection,如果我一次想要多个连接,我需要多个Sqlconnection对象。我对ClearPool()
的调用应该只会影响我传递给它的Sqlconnection对象,不是吗?我没有调用ClearAllPools()
。
System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection);