Ты довольно близко. Просто извлеките свой асиновый c код в методе или в Func<Task<string>>
, чтобы избежать окончания async void
:
Func<Task<string>> func = async () =>
{
var a = await GetWithSideEffects();
return a;
};
Затем вызовите его с помощью InvokeAsync
. Вы получите Task<Task<string>>
. Внутренняя задача - это задача, возвращаемая вашим асинхронным методом c, а внешняя задача - это задача, генерируемая InvokeAsync
для указания того, когда вызов фактически отправлен. Используйте .Unwrap
для объединения этих задач и, наконец, отправьте их другим способом:
var task = Dispatcher.InvokeAsync(func).Task.Unwrap();
foo.CallMeWithATaskThatIsFinishedWhenTheUIIsUpdated(task);