2014-01-14 3 views
0

좋습니다. 목표는 웹 페이지가 업데이트 된시기를 감지하고 업데이트 된 페이지를 WebBrowser 컨트롤에 표시하는 것입니다. 예를 들어, 아마존이 플레이 스테이션 4를 현재 사용할 수있게 할 것이라는 것을 알고 있다고 말하지만, 나는 언제 알지 못한다. 내 양식에 아마존 PS4 페이지의 주소를 넣고, 프로그램은 주기적으로 그 페이지에 WebBrowser를 시작하고 HTML을 문자열 목록에 저장합니다. 다음 번에 브라우저를 실행하면 내 목록과 비교하여 결과를 확인할 것입니다. 목록에 이미이 특정 문자열이 포함되어 있으면 WebBrowser가 닫히고 Thread.Sleep을 사용하여 다시 대기합니다.WebBrowser 및 Thread.Sleep oddity (WebBrowser 컨트롤 대신 기본 브라우저가 시작됨)

private void Launch() 
{ 
    while (blnWorking) 
    { 
    if (intWindowCount < intMaxCount) 
    { 
     ShowBrowserUri(GetBrowserUri()); 
    } 

    if (intWait > 0) 
     Thread.Sleep(intWait); 
    } 
} 

delegate void ShowBrowserUriDelegate(Uri uri); 

private void ShowBrowserUri(Uri uri) 
{ 
    if (InvokeRequired) 
    { 
    ShowBrowserUriDelegate del = new ShowBrowserUriDelegate(ShowBrowserUri); 
    Invoke(del, uri); 
    } 
    else 
    { 
    CookieContainer cc = GetUriCookieContainer(uri); 
    CookieCollection cc1 = new CookieCollection(); 

    if (cc != null) 
    { 
     cc1 = cc.GetCookies(uri); 
    } 

    THBrowser thb = new THBrowser(uri, cc1, this); //THBrowser is a form with a WebBrowser control 
    //THBrowser calls the Navigate method of its WebBrowser control 

    intWindowCount++; 
    thb.Show(); 
    thb.SendToBack(); 
    } 
} 

문제는 내 프로그램은 무작위로 파이어 폭스 (기본 브라우저)에서 웹 사이트를 여는 대신 THBrowser/웹 브라우저를 사용하는 것입니다. 나는 밟아 봤고, 나는 Thread.Sleep에서 물러날 때마다 일어나는 것처럼 보인다.

내 WebBrowser의 OnDocumentComplete가 현재 HTML을 HTML 문자열 목록과 비교하고 페이지 내용이 내 목록에 이미 포함되어있는 경우 컨트롤을 닫을 수도 있습니다.

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) 
    return; 

    if (ResultsList.Contains(this.webBrowser1.Document.Body.InnerHtml) 
    this.Close(); 
    else 
    ResultsList.Add(this.webBrowser1.Document.Body.InnerHtml); 
} 

내가 THBrowser 간단히 열기 때문에이 관련 될 수있는 생각

나는 내 앞에 최신 버전을 가지고 있지 않지만, 그 부분은 같은 간다가 ..., 다음, 사라지는 새로운 탭이 Firefox에서 즉시 열립니다.

나는 Thread.Sleep이 그와 관련이 있다고 확신한다. Thread.Sleep을 도입하기 전에 때때로이 문제를 보았지만 100 배로 증가했습니다.

어쩌면 Thread.Sleep이 내 간격을 배치하는 가장 좋은 방법은 아닙니다. 어쩌면 나는 완전히 완전히 잘못 될 것입니다. 모든 제안을 부탁드립니다.

답변

2

먼저 Thread.SleepWebBrowser 컨트롤이 아닌 Firefox에서로드되는 페이지와 관련이있을 가능성이 매우 낮습니다.

Thread.Sleep은 일반적으로 주기적으로 작업을 수행하는 가장 좋은 방법은 아닙니다. 타이머를 사용하면 더 나을 것입니다. Windows Forms를 사용하는 경우 System.Windows.Forms.Timer입니다. Interval을 원하는 지연 시간으로 설정하고 Tick 이벤트를 브라우저로 업데이트하십시오.

언제든지 새로운 WebBrowser 컨트롤을 만드는 이유가 확실하지 않습니다. 한 번만 작성하고 Refresh 메소드를 호출하는 것이 더 나을 것 같습니다.

마지막으로 WebBrowser이 필요합니까? WebClient.DownloadString을 사용하여 HTML을 다운로드하는 것이 더 나을 것입니다.

+0

나는 모든 호출에 대해 WebBrowser가 실제로 필요하지 않습니다. 대신 WebRequest를 사용하고 페이지가 변경된 후에 WebBrowser 만 시작하기로 결정했습니다. 전에 그 경로를 시도했지만 쿠키/세션이 유지되는 데 약간의 문제가있었습니다. 내가 그것을 내려 놓고 돌아 왔을 때 더 잘 작동하고있는 것 같습니다. –

+0

페이지가 Firefox로 전송 된 이유에 대해 궁금한 점이 많습니다. 내가 Thread.Sleep에서 읽고 있었고 내 이론은 자고있는 동안 url이 WebBrowser 객체에 보내지면 Windows는 어떻게 든 기본 브라우저를 백업으로 사용한다는 것입니다. –