2016-12-02 4 views
1

페이지를로드하는 웹 브라우저 기다립니다C#을 WPF : 나는</p> <p>내가 웹 브라우저가 성공적 여부를 여기 페이지를로드하는 코드입니다 있는지 확인하는 방법을 검색 WebBrowser 컨트롤을 추가 할 WPF 프로그램이

private async Task PageLoad(int TimeOut) 
{ 
    TaskCompletionSource<bool> PageLoaded = null; 
    PageLoaded = new TaskCompletionSource<bool>(); 
    int TimeElapsed = 0; 
    webBrowser.LoadCompleted += (s, e) => 
    { 
     if (webBrowser.ReadyState != webBrowser.Complete) return; 
     if (webBrowser.Task.IsCompleted) return; 
     PageLoaded.SetResult(true); 
    }; 

    while (PageLoaded.Task.Status != TaskStatus.RanToCompletion) 
    { 
     //interval of 10 ms worked good for me 
     await Task.Delay(10); 
     TimeElapsed++; 
     if (TimeElapsed >= TimeOut * 100) 
     { 
      //This prevents your method or thread from waiting forever 
      PageLoaded.TrySetResult(true); 
     } 
    } 
} 

하지만 왜 wpf에서는 작동하지 않습니다. 어떻게 변환합니까?

나는 이것을 확인하고 ReadyStateCompleteTask.IsCompleted에는 wpf와 같은 속성이 없습니다. wpf의 코드는 무엇입니까?

+0

[ASP.NET 용 WebBrowser 클래스의 Async/Await 구현] 가능한 복제본 (http://stackoverflow.com/questions/8610197/async-await-implementation-of-webbrowser-class-for-net) –

+0

으로 확인 웹 페이지가로드됩니다 모호한 것입니다. 웹 브라우저 컨트롤과 IE 모두 document.complete 이벤트에 연결할 수 있습니다. 물론 문제는 많은 자바 스크립트 프레임 워크가 문서로드가 완료된 후에 만로드를 시작한다는 것입니다. 따라서 document.complete 이벤트를 실행할 수는 있지만 웹 페이지를 더 많이 추가하는 스크립트가 계속 실행될 수 있습니다. –

답변

2

WebBrowser 컨트롤의 LoadCompleted 이벤트를 처리 할 수 ​​있습니다. 이 이벤트는 탐색 할 웹 페이지의 다운로드가 완료되면 발생합니다. https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted(v=vs.110).aspx

WebBrowser 컨트롤은 사용자가 기다릴 수있는 비동기 API 또는 Task 속성을 제공하지 않습니다. 그것은 단순히 그래서이 이벤트를 처리하는 이벤트가 정말 할 수있는 최선의 일이 발생합니다 :

webBrowser.LoadCompleted += (s, e) => 
{ 
    //the page has been loaded here. Do your thing... 
}; 

당신은 단지 당신이 예를 들어 SemaphoreSlim을 사용할 수로드하려면 페이지 (초)의 "제한 시간"수를 기다려야합니다 LoadCompleted 이벤트 핸들러에서 해제 한 내용은 다음과 같습니다.

private async Task LoadPageAsync(string url, int timeOutInSeconds) 
    { 
     using (System.Threading.SemaphoreSlim semaphore = new System.Threading.SemaphoreSlim(0, 1)) 
     { 
      bool loaded = false; 
      webBrowser.LoadCompleted += (s, e) => 
      { 
       semaphore.Release(); 
       loaded = true; 
      }; 
      webBrowser.Navigate(url); 

      await semaphore.WaitAsync(TimeSpan.FromSeconds(timeOutInSeconds)); 

      if (loaded) 
      { 
       //page was loaded 
      } 
      else 
      { 
       //page was not loaded... 
      } 
     } 
    } 
0

저는 거의 모든 솔루션을 제안했습니다. 여기 내 문제를 해결 한 것이 있습니다. 페이지와 상호 작용하기 전에이 메소드를 호출하십시오.

public void CheckWebBrowser() 
{ 
     while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete) 
      { 
       Application.DoEvents(); 
      } 
     return; 
} 

도움이되기를 바랍니다.