Прежде всего, я думаю, что это отличное упражнение для изучения того, как работает async / await.
Вы, кажется, перепрыгиваете через обручи, чтобы NavigateAsync возвращал задачу.Но он не должен возвращать задание, чтобы быть ожидаемым!Метод, который содержит await , должен возвращать Task, но метод, который является ожидаемым , не должен возвращать Task;все, что нужно сделать, это вернуть какой-то тип, который вы можете вызвать GetAwaiter.
Вы могли бы рассмотреть возможность реализации небольшого типа, подобного этому:
public struct WebBrowserAwaiter<T>
{
public bool IsCompleted { get { ... } }
public void OnCompleted(Action continuation) { ... }
public T GetResult() { ... }
}
и заставить NavigateAsync возвращать некоторый тип, для которого вы можете вызвать GetAwaiter, который возвращает WebBrowserAwaiter.Нет необходимости создавать задачу просто для того, чтобы получить ее метод GetAwaiter, когда вы можете создать свой собственный.
В более общем смысле вы можете подумать о том, что произойдет, если произойдет второй вызовNavigateAsync, пока первый еще находится в навигации?