kevin73
kevin73

Reputation: 19

c# winforms my ui still freeze with async in event load

In my event load of my form , I call a method loadDg:

private void form_Load(object sender, EventArgs e)
{
  loadDg();
}

and

private async Task loadDg()
        {
            pictureLoading.Visible = true;
            await Task.Run(() => { string[] datas = db.row("select * from products");
string[] datas2 = db.row("select * from users");
double one = Convert.ToInt32(datas[0]);
label1.Text = one.toString();
//....
});
pictureLoading.Visible = false; //hide gif animation 
}

in my code , db.row This method always returns only 1 row ( string array) , but my ui freezes still , i try update UI continuously with async without freeze at startup

Upvotes: 1

Views: 3116

Answers (3)

Paulo Morgado
Paulo Morgado

Reputation: 14836

Unnecessarily jumping between threads/context should be avoided.

This is an with better resource usage:

private async void form_Load(object sender, EventArgs e)
{
    pictureLoading.Visible = true;

    try
    {
        label1.Text = await LoadDgAsync();
    }
    catch
    {
        // error handling
    }
    finally
    {
        pictureLoading.Visible = false;
    }
}


private Task<string> LoadDgAsync()
{
    return Task.Run(() =>
    {
        string[] datas = db.row("select * from products");
        string[] datas2 = db.row("select * from users");
        double one = Convert.ToInt32(datas[0]);

        //....

        return one.toString();
    });
}

Upvotes: 0

aliassce
aliassce

Reputation: 1197

There is nothing to prevent your code run asynchronously. pictureLoading will be invisible even before task is completed. You should fix cross-thread problem and logic of the UI as this:

private void form_Load(object sender, EventArgs e)
{
  pictureLoading.Visible = true;
  loadDg();
}


private async Task loadDg()
{

    await Task.Run(() =>
    {
        string[] datas = db.row("select * from products");
        string[] datas2 = db.row("select * from users");
        double one = Convert.ToInt32(datas[0]);

        label1.BeginInvoke((Action)delegate ()
        {
            label1.Text = one.toString();
            //hide gif animation 
            pictureLoading.Visible = false;
        });
        //....
    });

}

Upvotes: 3

kiran sai bandreddy
kiran sai bandreddy

Reputation: 1

You are calling the loadDg() function synchronously.

Unless you await the loadDg() function call (since its return type is Task) and make the form_Load function asynchronous the function call will be synchronous.

The correct way to fix it is...

private async void form_Load(object sender, EventArgs e)
{
  await loadDg();
}

Upvotes: -2

Related Questions