0

每次我的 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过程完成或如果花费太长时间则取消它。

先感谢您

4

1 回答 1

0

您可以在代码或 ConnectionString 中为 SqlConnection 设置 ConnectionTimeout 属性。无需使用异步恕我直言..

cnn.ConnectionTimeout = 5000

因此,如果连接不起作用,这将产生大约 10 秒的延迟(connectiontimeout + Sleep(5000).

于 2013-09-12T17:22:42.113 回答