2012-07-24 6 views
2

저는 WPF (및 컴퓨터 과학 전반)를 처음 사용하고 5 개의 탭이 있고 각기 다른 사이트로 이동하는 내 보스로부터 작은 프로젝트를 받았습니다. 로그인하면 사용자는 첫 번째 탭의 웹 사이트로 이동합니다. 백그라운드에서 4 개의 다른 탭이 백그라운드에서로드되어야합니다.백그라운드에서 모든 탭을로드하는 방법

각각은 "tabItem1", "tabItem2", "tabItem2", "tabItem3", "tabItem4"부터 "tabItem5"까지입니다. 각각 안에 "webBrowser5"가 있습니다.

백그라운드에서 페이지를로드하는 스레딩을 사용해야한다고 생각하지만 구현 방법을 잘 모르겠습니다.

public MainWindow() 
{ 
    InitializeComponent(); 

    Thread thread1 = new Thread(Update1); 
    thread1.SetApartmentState(ApartmentState.STA); 
    thread1.Start(); 

    Thread thread2 = new Thread(Update2); 
    thread2.SetApartmentState(ApartmentState.STA); 
    thread2.Start(); 

    Thread thread3 = new Thread(Update3); 
    thread3.SetApartmentState(ApartmentState.STA); 
    thread3.Start(); 

    Thread thread4 = new Thread(Update4); 
    thread4.SetApartmentState(ApartmentState.STA); 
    thread4.Start(); 
} 

private void Update1() 
    { 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
      (ThreadStart)delegate() 
       { 
       tabItem2.Focus(); 
       } 
     ); 
    } 

private void Update2() 
    { 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
      (ThreadStart)delegate() 
       { 
       tabItem3.Focus(); 
       } 
     ); 
    } 

//...Goes up to Update4 

이 마지막 스레드에 집중하는 것 또한 그것에게 배경을하지 않습니다 나는 등의 MainWindow를에 4 개 개의 스레드를 생성했습니다. 나는 어떤 지침과 도움을 주셔서 감사합니다. 감사!

+0

4 개의 스레드가 시작됩니다.이 스레드는 바로 탭에 포커스를 설정하기 위해 UI 스레드 *로 즉시 호출 된 다음 즉시 종료됩니다. 모든 실제 작업은 UI 스레드에서 수행되고 있습니다. 사용자가 컨트롤과 상호 작용해야하기 때문에 그렇습니다. 무슨 일이 일어나기를 기대 했습니까?내 생각 엔 각 탭에서 일종의 데이터로드를 수행해야한다는 것입니다. 데이터가 어떻게로드되는지 보여줄 수 있습니까? –

+0

초점을 수행하면 각 탭에 하나씩 초점이 맞춰 지지만 너무 빠르므로 마지막 작업 만 볼 수 있습니다. 특정 URL로 웹 브라우저를로드해야합니까? – Clueless

+0

@ChrisShain 데이터로드 방법을 100 % 확신하지는 못했지만 다른 웹 사이트 링크 일뿐입니다. 다음은 각 격자 항목이 XAML 파일의 모습입니다 :

답변

1

디스패처는 메인 스레드에서 작동합니다. 개체가 주 스레드에 있기 때문에 주 스레드가 포커스를 설정하도록했습니다.

문제 :

대답은이 작업을 수행해야하는 이유에있다. Windows 컨트롤에서 생성 된 스레드가 아닌 다른 스레드에서 조작 할 수 없습니다. 또한 한 스레드에서 컨트롤을 만들고 다른 스레드에서 컨트롤의 자식으로 설정할 수 없습니다.

당신에게 무엇을 의미 하는가 ... 당신의 상사가 당신에게해야 할 일은 할 수 없다는 것입니다. 백그라운드에서 수행 할 수있는 유일한 작업은 알고리즘을 계산하는 것입니다. 기껏해야 데이터을로드하고 데이터에서 작동하고 데이터으로 해석 할 수 있지만 해당 데이터를 Windows 컨트롤에 표시하거나 변환하려면 해당 작업을 수행해야합니다. 주 스레드에.

유일한 해결책은 :

그러나 여러 UIThreads을 가질 수 있습니다. 즉, Window을 여러 개 만들 수 있습니다. 따라서,해야 할 일은 각 탭 내용에 대해 별도의 스레드에 창을 작성한 다음 각 탭에 스레드 창을 호스트하는 것입니다.

Dispatcher.BeginInvoke((Action)(() => 
{ 
     // load the pages 
}), DispatcherPriority.Background, null); 

것은 그 코드가 될 것이다 : 나는 Xaade에 동의하지 않는

Threading windows

Host process window

Cross thread hosting

+0

빠른 응답을 보내 주셔서 감사합니다. 그래서 각 탭마다 5 개의 다른 xaml 파일을 갖게 될 것이라고 추측합니다. –

+0

@ J-Y 5 개의 다른 xaml 파일뿐만 아니라 5 개의 다른 창. 그러나 xaml에 정의 할 수 있습니다 (각 창에 대해 동일한 xaml을 사용할 수 있지만 다른 대상 웹 사이트를 제공 할 수 있음). 요점은 별도의 스레드에서 창을 만들고 핸들을 얻은 다음 주 스레드의 각 탭에 창 호스트를 만드는 것입니다. 그런 다음 창 호스트에서 스레드 창을 호스팅하십시오. 호스팅 된 윈도우의 테두리가 나타나기 때문에 경계선없는 창을 설정해야합니다. –

0

, 난 당신 만이 코드를 사용하여 필요한 일을 할 수 있다고 생각 백그라운드에서 실행되므로 필요한 모든 웹 브라우저를로드 할 수 있습니다.

DispatcherPriority를 ​​Background으로 지정하면됩니다.

+0

안녕하세요. 도움을 청합니다. 페이지를로드하는 내장 기능은 무엇입니까? 죄송합니다.이 C# 및 WPF는 모두 초보자입니다. –

+0

안녕하세요, webBrowser의'Source' 속성을 사용할 수 있습니다. – Dante

+0

webBrowser2.Source를 넣을 때 오류가 발생합니다. 발송자 메소드에서 "할당, 호출, 증가, 감소 및 새 오브젝트 표현식 만이 명령문으로 사용될 수 있습니다." –

관련 문제