【发布时间】:2013-09-12 17:01:26
【问题描述】:
每次我的 SQL Server 连接出现问题(例如有人切换服务器)时,我的应用程序都会在消息框中显示异常消息。我不知道连接何时可用,除非我一直尝试打开连接/执行查询。
所以我创建了一个等待表单,如果连接不可用,它将出现,继续尝试打开连接,并在连接再次可用时自行关闭。
为了对用户隐藏冻结,我使用了后台工作人员。
这是后台工作代码
private void StartLoader(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 10; i++)
{
if (this.par.sqSuccess) //if no error, means connection is available, stop looping
{
break;
}
else
{
i -= 1;
}
System.Threading.Thread.Sleep(5000); //report progress every 5 second
}
这是后台worker的进度改变事件
this.cnn = new SqlConnection(this.par.Constr);
try
{
this.cnn.Open(); //SqlConnection
this.par.sqSuccess = true; //if no error, then I change this variable
}
catch (Exception ex)
{
this.par.Exception = ex.Message;
}
finally
{
if (this.cnn != null) { this.cnn.Dispose(); }
}
if (this.par.sqSuccess) { this.Close(); }
一切完成后,我尝试从services.msc停止SQL Server服务,然后尝试连接。
等待表单将出现并继续工作。
尝试连接几秒钟后,我再次启动服务,等待表单关闭,成功。 这就是问题所在,当我在再次启动服务之前稍等片刻时,等待表单仍然关闭,但需要一段时间。
检查完所有内容后,cnn.open() 似乎排队了,我停止服务的时间越长,等待表单关闭的时间就越长。
我搜索了谷歌并尝试添加 Connect Timeout=3;在我的连接字符串后面,因为我确定我的 thread.sleep(5000) 不会让它们排队,但仍然无法正常工作。
有人告诉我使用cnn.OpenAsync();
在阅读了关于OpenAsync 的文档后,我就是这样做的。
static async Task<ConnectionState> Method(SqlConnection cnn)
{
await cnn.OpenAsync();
return cnn.State;
}
还有这个
private void SQLClientLoader_Load(object sender, EventArgs e)
{
do
{
this.cnn = new SqlConnection(this.par.Constr);
try
{
ConnectionState cst = Method(cnn).Result;
if (cst == ConnectionState.Open)
{
this.par.sqSuccess = true;
}
else
{
}
}
catch (Exception ex)
{
this.par.sqSuccess = false;
this.par.Exception = ex.Message;
}
finally
{
}
} while ((bool)this.par.sqSuccess != true);
}
每次执行表单加载代码时,上面的代码都会冻结我的应用程序。
我需要简单的说明,说明如何等待cnn.Open 进程完成或在时间过长时取消它。
提前谢谢你
【问题讨论】:
-
设置连接超时属性怎么样?
-
我确实设置了连接超时,但仍然不明白为什么 cnn.Open 排队。
标签: c# sqlconnection