Application dispatcher invoke freezes the application

2k views Asked by At

I am having problem with the application freezing. Let me explain my scenario, I have a service which does an async call to a database to get a list of items, It is run by a task. Inside this task I have a try catch block, so it looks like this

public Task<List<T>> ComboListAsync(int? id = null, EnumDTO dto = EnumDTO.Default)
    {
        return Task.Run(() =>
        {
            using (var context = new ContextService())
            {
                try
                {
                    return GetComboList(id, dto, context);
                }
                catch (Exception e)
                {
                    Handler.DatabaseConnectionException();
                    throw;
                }
            }
        });
    }

Then it throws an exception as GetComboList its just this (for the moment)

    protected virtual List<T> GetComboList(int? id, EnumDTO dto, ContextService context)
    {
        throw new NotImplementedException();
    }

So the call catches the exception and goes inside here

    public void Show(string message)
    {
        Message = message;
        Application.Current.Dispatcher.Invoke(() =>
        {
            dialogView = new DialogView() {DataContext = this, Owner = Application.Current.MainWindow};
            dialogView.ShowDialog();
        });
    }

Now the Dispatcher freezes the app, I tried to change it to use begin invoke, it does the same. Without the dispatcher I get an error message that the calling thread is not a STA. I simply want to display my message in a dialog window, that there was a problem connecting to a database. Can anyone help? I looked online and there is many threads about dispatcher, but none actually show a solution that will fix my issue.

Thank you

EDIT Code which calls the ComboListAsync

    protected override void RetrieveRelatedActiveLists()
    {
        MyCollection = service.ComboListAsync().Result;
    }
1

There are 1 answers

5
Marcelo de Aguiar On BEST ANSWER

Its a deadlock because of the calling code is using the .Result.

Using service.ComboListAsync().Result makes the UI thread await for this method to return, when you call Application.Current.Dispatcher.Invoke from within it you are sending a message to the UI thread that is awaiting the return of method itself.

You must await the method service.ComboListAsync() like this:

  protected override async void RetrieveRelatedActiveLists()
  {
      MyCollection = await service.ComboListAsync();
  }