【问题标题】:Connecting to SQL Server without freezing WPF在不冻结 WPF 的情况下连接到 SQL Server
【发布时间】:2018-04-08 09:00:52
【问题描述】:
private async void Button_Click(object sender, RoutedEventArgs e)
{
    var sampleMessageDialog = new SampleMessageDialog
            {
                Message = { Text = "Failed to connect" }
            };

    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionS"].ConnectionString);

    try
    {
        con.Open();
        //  await DialogHost.Show(sampleMessageDialog, "RootDialog");
        con.Close();
    }
    catch (Exception ex)
    {
        await DialogHost.Show(sampleMessageDialog, "RootDialog");
    }
}

当凭据正确时,一切似乎都运行顺利。但是,当我为 SQL Server 连接字符串输入错误的凭据时,它似乎在我单击按钮的第二次冻结,并且对话框仅在冻结后显示。

【问题讨论】:

  • 当您在提供错误凭据的情况下尝试打开连接时,会出现更长的线程块。尝试使用await con.OpenAsync(); instaed。
  • 您的用户要为数据库连接输入凭据?通常不是一个好主意。我建议让连接超时时间更长而不是更短会提高安全性。

标签: c# sql-server wpf


【解决方案1】:

当您在提供错误凭据的情况下尝试打开连接时,会出现更长的线程阻塞。尝试使用await con.OpenAsync(); 来释放 UI 线程。

【讨论】:

  • 这似乎有效,但除非我更改超时,否则显示对话框需要很长时间(但是是的,不会冻结)。例如,是否可以显示我的循环进度条,直到返回来自数据库的对话框/回复?
  • async 将帮助您不阻塞 UI 线程,但根据您的代码,只有在打开连接后才会出现对话框..这是您想要的吗?
  • UI 不再冻结。但是,如果连接超时设置为 30,例如,UI 将不会发生任何事情。相反,用户将等待 30 秒,直到 Dialog 出现并告诉他连接不成功。所以我要问的是,如果我能做些什么呢?比如在我点击按钮和连接失败返回之间显示一个progressBar?
  • 酷。如何实现进度条,我建议你看另一个SO帖子:stackoverflow.com/questions/8447856/…
  • 谢谢,我去看看。现在你提到了,如果你不介意,BackGroundWorker/delegate 调用和我刚刚做的 Async 有什么区别?他们的目的不一样吗?
【解决方案2】:

我不知道异步连接的方法,但您可以设置连接超时。

SqlConnection.ConnectionTimeout Property

没有看到 DialogHost.Show 上等待的目的。

【讨论】:

  • 连接超时也只影响连接或查询?另外,例如,如果我将其设置为 1 秒,是否足以成功连接?或者换句话说,使用正确凭据的连接是否需要不到 1 秒的时间?
  • 文档对我来说很清楚。我不能代表你的环境。
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 2011-06-15
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多