UWP WebView ждут навигации - PullRequest
       8

UWP WebView ждут навигации

0 голосов
/ 10 марта 2019

Я пытаюсь получить контент на сайте, который отображается с помощью JavaScript. Так что я бегу WebView с Visibility=Collapsed. Я хочу подождать unitl NavigationCompleted и запустить JavaScript, а затем вернуть значение.

Код выглядит так:

private async void Foo()
{
    // Want to get value here
    var content = await GetContent();
}

private async Task<string> GetContent()
{
    string content;
    async void handler(WebView sender, WebViewNavigationCompletedEventArgs args)
    {
        content = await webView.InvokeScriptAsync("eval", new string[] { script });
        webView.NavigationCompleted -= handler;
    }
    webView.NavigationCompleted += handler;
    webView.Navigate(uri);
    return content;
}

Поскольку в GetContent() ожидание отсутствует, функция всегда возвращается до срабатывания NavigationCompleted.

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Я думаю, вы должны использовать TaskCompletionSource .Создайте источник и установите его результат в конце обработчика событий после выполнения сценария.Перед возвратом содержимого дождитесь задания источника завершения задачи.

1 голос
/ 12 марта 2019

Вы можете использовать SemaphoreSlim для асинхронного ожидания, пока NavigationCompleted не будет поднят и обработан:

private async Task<string> GetContent()
{
    string content;
    using (SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 1))
    {
        async void handler(WebView sender, WebViewNavigationCompletedEventArgs args)
        {
            content = await webView.InvokeScriptAsync("eval", new string[] { script });
            webView.NavigationCompleted -= handler;
            semaphoreSlim.Release();
        }
        webView.NavigationCompleted += handler;
        webView.Navigate(uri);
        await semaphoreSlim.WaitAsync().ConfigureAwait(false);
    }
    return content;
}
0 голосов
/ 10 марта 2019

Если вы хотите что-то подождать, вы можете использовать ManualResetEvent.Просто убедитесь, что вы не используете ManualResetEvent.WaitOne в потоке пользовательского интерфейса, так как это приведет к зависанию приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...