I'mBehnam
I'mBehnam

Reputation: 7

Async task didn't run - c#

btnSave Event: in this event i wana update datagridview but it's not working :(

private async void btnSave_Click(object sender, EventArgs e)
        {
            if (this.ValidateChildren(ValidationConstraints.Enabled))
            {
                Remember remember = new Remember();

                remember.RememberTitle = txtTitle.Text;
                remember.RememberDate = dateTimePickerRememberDate.Value.Date;
                remember.RememberTime = dateTimePickerRememberTime.Value.TimeOfDay;
                remember.RememberContent = txtDescription.Text;
                remember.RememberTransaction = false;
                remember.RememberExpire = false;

                var res  = await Rep_App.NewRemember(remember).ConfigureAwait(false);
                if (res)
                {
                    MessageBox.Show("Success");
    //this line did not executed
                    await GetRemembers();
                }
                else
                {
                    MessageBox.Show("...");
                }
            }
        }

GetRemember method :

private async Task GetRemembers()
    {
        try
        {
            // Instantiate a new DBContext
            ParkingManager.Context.DataBaseContext dbContext = new ParkingManager.Context.DataBaseContext(PublicVariables.ConnectionString);
            // Call the LoadAsync method to asynchronously get the data for the given DbSet from the database.
            await dbContext.Remembers.LoadAsync().ContinueWith(loadTask =>
            {
                // Bind data to control when loading complete
                remembersBindingSource.DataSource = dbContext.Remembers.ToList();

            }, System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext());

        }
        catch (InvalidOperationException)
        {
            return;
        }
        catch (Exception)
        {
            MessageBox.Show(MessagesStruct.Exception);
        }
    }

GetRemember() did not execute in Save Event but when the form loaded GetRemember() executed completely, what's wrong?

Upvotes: 0

Views: 130

Answers (1)

Panagiotis Kanavos
Panagiotis Kanavos

Reputation: 131228

The problem is caused by ConfigureAwait(false) and ContinueWith. ConfigureAwait(false) will cause execution to continue on a background thread instead of getting back to the UI. LoadAsync isn't needed either, the data will be loaded by ToList or ToListAsync().

EF Core and async/await don't need so much code. All of this can be replaced with

var res  = await Rep_App.NewRemember(remember);
if (res)
{
    MessageBox.Show("Success");
    using(var dbContext = new DataBaseContext(PublicVariables.ConnectionString))
    {
        remembersBindingSource.DataSource = await dbContext.Remembers.ToListAsync();
    }
}
else
{
    MessageBox.Show("...");
}

Upvotes: 3

Related Questions