开发者

Loading data from DB asynchronously in win forms

开发者 https://www.devze.com 2023-01-31 18:57 出处:网络
many time we populate UI with data from DB in the form load and that is why form gets freeze for few second. so i just want to know how can i load data asyn开发者_开发问答chronously and populate UI in

many time we populate UI with data from DB in the form load and that is why form gets freeze for few second. so i just want to know how can i load data asyn开发者_开发问答chronously and populate UI in form load as a result my form will not freeze and also will be responsive but i don't want to use background worker class. please help me with sample code which can solve my problem.

thanks


Here is a well commented example code:

Example:

// This method can be called on Form_Load, Button_Click, etc.
private void LoadData()
{
    // Start a thread to load data asynchronously.
    Thread loadDataThread = new Thread(LoadDataAsync);
    loadDataThread.Start();
}

// This method is called asynchronously
private void LoadDataAsync()
{
    DataSet ds = new DataSet();

    // ... get data from connection

    // Since this method is executed from another thread than the main thread (AKA UI thread),
    // Any logic that tried to manipulate UI from this thread, must go into BeginInvoke() call.
    // By using BeginInvoke() we state that this code needs to be executed on UI thread.

    // Check if this code is executed on some other thread than UI thread
    if (InvokeRequired) // In this example, this will return `true`.
    {
        BeginInvoke(new Action(() =>
        {
            PopulateUI(ds);
        }));
    }
}

private void PopulateUI(DataSet ds)
{
    // Populate UI Controls with data from DataSet ds.
}


Command.BeginExecuteReader()

may serves your need for reading purposes.

Here is Sample Code for this method.

You can call Application.DoEvents() while waiting for response to keep your window responsive.


Have a look at this article. http://aspadvice.com/blogs/azamsharp/archive/2007/04/05/Executing-a-Query-Asynchronously-in-.NET-2.0.aspx

It still uses Background worker. Honestly, I can't think of an alternative solution to this this other than threading your application to execute queries and bind returned results. If you do decide to use threads, than i suggest you take a look at this article about thread-pooling for asynchronous execution: http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml


Your best course of action is to use another thread. You can use one straight from the thread pool by calling ThreadPool.QueueUserWorkItem.

    private void OnFormLoad()
    {
        ThreadPool.QueueUserWorkItem(() => GetSqlData());
    }

    private object GetSqlData()
    {
        using (var connection = new SqlCeConnection("ConnectionString"))
        {
            using(var command = new SqlCeCommand())
            {
                command.Connection = connection;
                command.CommandText = "SELECT * FROM tbl_hello";
                command.ExecuteReader();

                while (command.ExecuteReader().Read())
                {
                    //Put data somewhere
                }
            }
        }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号