显示加载消息,直到完成SQL数据检索

时间:2014-05-28 21:51:46

标签: c# winforms long-running-processes

我正在使用WeifenLuo dockpanel-suit。

我需要在SQL完成加载数据之前显示某种启动表单或加载消息。

我尝试过的工作

  public partial class frmPostventa : DockContent
    {
       private void frmPostventa_Load(object sender, EventArgs e)
        {   

            bool done = false;
            ThreadPool.QueueUserWorkItem((x) =>
            {
                using (var splashForm = new SplashForm())
                {
                    splashForm.Show();
                while (!done)
                    Application.DoEvents();
                splashForm.Close();
            }
        });
        //Database task heavy load
        cargarDatos();
        done = true;

    }

    public void cargarDatos()
    {

        string strSQL = "exec SAI_ALGO.spPostventa";

        SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, strCon);
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

        // Populate a new data table and bind it to the BindingSource.
        DataTable table = new DataTable();
        table.Locale = System.Globalization.CultureInfo.InvariantCulture;
        dataAdapter.Fill(table);
        bindingSource1.DataSource = table;

    }


}

编辑:添加了CargarDatos()

1 个答案:

答案 0 :(得分:0)

DoEvents()几乎总会导致一个非常糟糕的地方,并且几乎总是应该避免。这个特定实现的问题在于,长时间运行的进程(cargarDatos())将阻塞UI线程直到它完成,因此DoEvents()将不起作用;它不会在执行时中断一个方法(假设cargarDatos()不在内部做一些会产生线程的东西)。此外,从某个后台线程创建UI控件并与之交互在此处无效。

您应该使用BackgroundWorker执行长时间运行操作并向UI提升状态更新:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx