每次我的 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
}
这是后台工作人员的进度更改事件
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(); }
一切都完成后,我尝试停止 SQL Server 服务services.msc
,然后尝试连接。
等待表格将出现并继续工作。
尝试连接几秒钟后,我再次启动服务,等待表单关闭,成功。这就是问题所在,当我在再次启动服务之前等待一段时间时,等待表单仍然关闭,但需要一段时间。
在我检查完所有内容后,似乎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
过程完成或如果花费太长时间则取消它。
先感谢您