【问题标题】:App not processing events while trying to open database connection应用程序在尝试打开数据库连接时未处理事件
【发布时间】:2022-11-09 04:25:59
【问题描述】:

我正在 Windows 10 机器上使用 Visual Studio 2022 用 C# 编写 Windows 窗体应用程序。该应用程序连接到 Azure 数据库,该数据库运行良好。我的问题是,有时连接需要几秒钟(可能需要 10 秒左右),或者如果出现错误,它会一直到超时限制(通常是 20 到 30 秒),然后再返回任何错误消息。

我正在尝试在此期间向用户提供一些视觉反馈,但应用程序似乎没有处理任何事件,因此我尝试发送的任何类型的反馈在操作完成之前都不会完成(此时这是没有实际意义的)。

关于如何处理这个问题的任何想法?我是否需要在不同的线程上打开数据库,如果需要,每当我使用在不同线程上打开的数据库对象时,这是否会成为整个应用程序其余部分的问题?

我正在尝试一些简单的事情,比如逐渐添加一排点,如下所示:

        private void InitCloudDatabase()
        {
            Boolean success = true;


            WorkingTimer.Enabled = true;
            WorkingTimer.Start();

            try
            {
                AzureAgDatabase db = new AzureAgDatabase();
                db.OpenConnection();
            }
            catch
            {
                success = false;
            }

            WorkingTimer.Stop();

            pbCloudResult.Image = (success) ? Properties.Resources.icons8_done_96 :
                                              Properties.Resources.Red_X___Fail;
        }

        private void WorkingTimer_Tick(object sender, EventArgs e)
        {
            lblCloud.Text += " .";
            if (lblCloud.Text.Contains(" . . . . . . . . . . .")) 
            { 
                lblCloud.Text = "Database Connection (Cloud)"; 
            }
        }

【问题讨论】:

    标签: c# .net multithreading azure-sql-database


    【解决方案1】:

    我以前没有真正使用过 Windows 窗体,但是在大多数基于 UI 的应用程序中,您应该为 UI 操作保留 UI 线程,并将所有耗时的任务(计算或 I/O)移动到不同的线程以确保 UI仍然响应。

    对于 Windows 窗体,看起来您有一个 BackgroundWorker 类,您可以使用该类将数据库操作卸载到其中。这是您可以参考的a walkthrough in the official docs

    另一种方法是使用Task 类异步运行数据库代码,与第一种方法相比,代码更少。您只需将花费时间的语句包装在Task.Run 调用中,并在continuation task 中包含后续语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2017-12-23
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多