【问题标题】:How to display wait message while application is working with database?应用程序使用数据库时如何显示等待消息?
【发布时间】:2014-01-30 06:24:35
【问题描述】:

如何在我的 Windows 应用程序使用数据库时显示等待消息。

问题是当我显示消息“请稍候...”时,应用程序在完成数据库操作之前没有响应。

我有一个简单的函数,它在执行时与 db 交互我想显示一条消息,如“请稍候...”

但是我的应用程序不应该挂起并且必须响应用户交互。

这是我的职责。

         public void getReleaseInfo(Label lblDbVersion)
            {
                if (gc.logger.IsInfoEnabled)
                    gc.logger.Info("getReleaseInfo - Method Start");

                string l_sConfigPath = gc.APP_CONFIG_FILE_PATH;
                var element = XDocument.Load(l_sConfigPath).Descendants("configuration").Descendants("connectionStrings");
                if (element != null)
                {
                    foreach (var item in element.Elements("add"))
                    {
                        gc.APP_CONNECTIONSTRING = (string)item.Attribute("connectionString");
                    }
                }
                try
                {
                    m_oConn = new SqlConnection(gc.APP_CONNECTIONSTRING);
                    m_oConn.Open();
                    using (SqlDataAdapter l_oDA = new SqlDataAdapter(gc.SP_GETRELEASEINFO, m_oConn))
                    {
                        l_oDA.SelectCommand.CommandType = CommandType.StoredProcedure;
                        using (DataSet l_oDS = new DataSet())
                        {
                            l_oDA.Fill(l_oDS);
                            if (!l_oDS.HasErrors)
                            {
                                if (l_oDS.Tables[0].Rows.Count > 0)
                                {
                                    lblDbVersion.Text = string.IsNullOrEmpty(l_oDS.Tables[0].Rows[0]["ReleaseInfo"].ToString()) ? "Release information not available" : l_oDS.Tables[0].Rows[0]["ReleaseInfo"].ToString();
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    tsslDbError.ForeColor = System.Drawing.Color.Red;
                    lblDbVersion.Text = "iReg Release Information Not Available";
                    tsslDbError.Text = "Unable to connect with iReg Database, Please contact iReg Suppot!";
                    btnBrowse.Enabled = false;
                    btnBackup.Enabled = false;
                }
                finally
                {
                    if (m_oConn != null)
                    {
                        if (m_oConn.State == ConnectionState.Open)
                            m_oConn.Close();

                        m_oConn.Dispose();
                    }
                }

                if (gc.logger.IsInfoEnabled)
                    gc.logger.Info("getReleaseInfo - Method End");
            }

我从这里调用该函数。

            try
            {
                lblDbVersion.Text = string.Empty;
                this.tsslDbError.ForeColor = System.Drawing.Color.Black;
                tsslDbError.Text = "Please wait... While connecting to iReg Database.";
                getReleaseInfo(lblDbVersion);   
                this.tsslDbError.Text = string.Empty;

            }
            catch (Exception ex)
            {                   
                this.tsslDbError.ForeColor = System.Drawing.Color.Red;
                lblDbVersion.Text = "iReg Release Information Not Available";
                this.tsslDbError.Text = "Unable to connect with iReg Database, Please contact iReg Suppot!";
                btnBrowse.Enabled = false;
                btnBackup.Enabled = false;
            }
            finally 
            {

            }
            if (gc.logger.IsInfoEnabled)
                gc.logger.Info("btnIregPath_Click - Method End");
        }

【问题讨论】:

  • 如果您使用的是 .net 4.5,那么您可以使用 async 和 await 来实现这一点。

标签: c# windows winforms


【解决方案1】:

您必须在单独的线程中执行数据库调用,以便在数据库调用运行时保持响应式 UI。

【讨论】:

    【解决方案2】:

    我建议你使用 Backgroundworker (System.ComponentModel)

    您的代码应该是这样的(它是一个示例... ;-) 不是一个完美的解决方案,例如 如果发生错误,您将永远不会看到错误填充的标签,但始终为空。我想你可以理解为什么。请注意,您可能会收到一些“不安全代码警告”,试图更改在不同线程中创建的标签内容以避免管理 workerprogess 更改)。

    using (BackgroundWorker bgw = new BackgroundWorker())
    {
        bgw.DoWork += bgw_DoWork;
        bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
    
        this.tsslDbError.ForeColor = System.Drawing.Color.Black;
        tsslDbError.Text = "Please wait... While connecting to iReg Database.";
        bgw.RunWorkerAsync();
    }
    

    当然你必须添加这些方法:

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.tsslDbError.Text = string.Empty;
        if (gc.logger.IsInfoEnabled)
            gc.logger.Info("btnIregPath_Click - Method End");
    }
    
    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            lblDbVersion.Text = string.Empty;
            getReleaseInfo(lblDbVersion);
        }
        catch (Exception ex)
        {
            this.tsslDbError.ForeColor = System.Drawing.Color.Red;
            lblDbVersion.Text = "iReg Release Information Not Available";
            this.tsslDbError.Text = "Unable to connect with iReg Database, Please contact iReg Suppot!";
            btnBrowse.Enabled = false;
            btnBackup.Enabled = false;
        }
    }
    

    【讨论】:

      【解决方案3】:

      如您所知,由于计算机的速度,如果发生此类错误,它将永远不会与您的方法一起显示,因为如果没有像消息框这样的停止点,下一个错误将以毫秒为单位覆盖先前的错误。显示或逐行写入错误的文本框。

      如果错误数量不是很大,我建议你使用日志文本框。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 2011-11-12
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2013-05-12
        相关资源
        最近更新 更多