Async-await wydaje się używać wątku interfejsu użytkownika

W modelu widoku używam fabryki:

private async Task<BaseData> InitializeAsync()
{
    await InstancesAsync();
    await ProjectsAsync();
    await AdminAsync();
    return this;
}
public static async Task<BaseData> CreateAsync()
{
    var ret = new BaseData();
    return await ret.InitializeAsync();
}

Oczekiwane metody są dość szybkie, np.

 var instances = await TaskEx.Run(new Func<List<string>>(() => Agent.GetInstances()));

W widoku wpf chcę ustawić DataContext w konstruktorze:

Loaded += delegate
{
    Dispatcher.Invoke(new Action(async () => { DataContext = await BasisGegevens.CreateAsync(); }));
};

Chociaż działa, czuję się raczej nieswojo, ponieważ używany jest wątek interfejsu użytkownikawszędzie, także po wywołaniach zwrotnych, gdy oczekiwania się zakończą. czego mi brakuje?

Nie rozumiem też, jak używać wzorca fabrycznego dlaDataContext ponieważ bezInvoke powyżej otrzymuję błąd, że obiekt posiada inny wątek.

EDYCJA: korzystając z pomysłów pana Cleary otrzymuję:

Loaded += async (object sender, RoutedEventArgs e) =>
          { DataContext = await BaseData.CreateAsync(); };
public static Task<BaseData> CreateAsync()
{
    var ret = new BaseData();
    return ret.InitializeAsync();
}
private async Task<BaseData> InitializeAsync()
{
    // UI thread here
    await InstancesAsync().ConfigureAwait(false);
    // thread 'a' here
    await ProjectsAsync().ConfigureAwait(false);
    // thread 'a' sometimes 'b' here
    await AdminAsync().ConfigureAwait(false);
    // thread 'a' or 'b' here
    return this;
}

To działa dobrze, z wyjątkiem tego, że nie rozumiem jakConfigureAwait(false) Prace.
Wewnątrz metodyInstancesAsync() Mam oczekiwane zadanie:
var instances = await TaskEx.Run(new Func<List<string>>(() => Agent.GetInstances()));
Po oczekiwaniu na repsonse wracam do wątku interfejsu użytkownika - nigdy nie spodziewałem się, że tak się stanie!
Zauważ, żeProjectsAsync() iAdminAsync() zachowuj się tak samo, chociaż zaczynają się od wątku pracownika (lub tła)!
Mam to na myśliConfigureAwait(true) ma efekt powrotu w wątku wywołującym (w moim przypadku wątku interfejsu użytkownika). Przetestowałem to i tak jest.
Dlaczego to widzę?ConfigureAwait(false) też: z powodu zagnieżdżonego oczekiwania, zobacz komentarze.

questionAnswers(1)

yourAnswerToTheQuestion