2012-06-11 3 views
1

먼저 웹 브라우저가 자체 작업을 수행하는 WebBrowser-s입니다. 사용자는 모든 것을 보거나 그 중 하나만 (또는 없음) 볼 수 있어야하고 각각에 대해 명령을 실행할 수 있어야합니다. 브라우저가없는 메인 폼이 있는데, 여기에는 내 응용 프로그램을위한 제어판이 들어 있습니다.C# : 병렬 양식, 멀티 스레딩 및 "응용 프로그램의 응용 프로그램"

중요한 점은 각 브라우저가 보안 웹 페이지에 로그온하고 가능하면 오랫동안 로그인 상태를 유지해야한다는 것입니다. 글쎄, 해봤지만 내 접근 방식에 문제가 있다는게 두렵다.

질문 :

internal class SessionList : List<Session> { 

    public SessionList(Server main) { 
     MyRecords.ForEach(record => { 
      var st = new System.Threading.Thread((data) => { 
       var s = new Session(main, data as MyRecord); 
       this.Add(s); 
       Application.Run(s); 
       Application.ExitThread(); 
      }); 
      st.SetApartmentState(System.Threading.ApartmentState.STA); 
      st.Start(record); 
     }); 
    } 

    // some other uninteresting methods here... 

} 

여기 무슨 일이야 :

문제를 일으킬 수있는 유효한 아래 코드, 또는 오히려 불쾌한 해킹인가? 세션은 양식을 상속하므로 양식을 만들고 WebBrowser를 넣고 웹 사이트에서 작동 할 수있는 방법을 가지고 있습니다. WebBrowser는 STA 스레드에서 실행해야하므로 각 브라우저에 하나씩 제공됩니다. 가장 흥미로운 부분은 Application.Run(s)입니다. 새로 생성 된 양식을 생동감 있고 대화식으로 만듭니다. 다음 Application.ExitThread()은 브라우저 창이 닫히고 컨트롤이 삭제 된 후에 호출됩니다. 주 응용 프로그램은 나머지 정리 작업을 수행하기 위해 계속 작동합니다.

"Exit"또는 "Shutdown"옵션을 선택하면 브라우저 스레드가 끝나기 때문에 Application.ExitThread()이 호출됩니다. 모든 것이 작동하지만 "GUI 기본 스레드"에 대한 모든 것을 읽을 수 있습니다. 여기서는 많은 GUI 스레드를 생성했습니다. Invoke()을 사용하여 thread-safe 메소드로 메인 폼과 새로운 폼 (세션) 간의 통신을 처리합니다. 그것은 모두 작동합니다. 그래서 맞습니까? 아니면 잘못입니까?

하나의 응용 프로그램에서 Application.Run()을 두 번 이상 사용하면 모든 것이 올바르게됩니까? :) 추한 해킹이나 정상적인 연습? 이 코드는 세션 양식 스레드에서 WebBrowser를 시작하면 작동하지 않습니다. 그것은 왜 저를 때린다. 그러나 다른 스레드에서 WebBrowser (Url 속성을 변경하여)를 시작하면 작동합니다. 이러한 응용 프로그램에서 실제로 어떤 일이 일어나는지 더 알고 싶습니다. 하지만 무엇보다도 "응용 프로그램의 응용"에 대한 제 아이디어가 괜찮은지 알고 싶습니다.

정확히 Application.Run()은 무엇을하는지 모르겠습니다. 그것 없이는 새로운 스레드에서 생성 된 폼은 응답이 없습니다. Application.Run()을 여러 번 호출 하는게 어떨까요? 그것이해야하는 것을 정확하게하는 것처럼 보인다. 그러나 그것은 나에게 약간의 문서화되지 않은 특징 인 것처럼 보인다. WebBrowser 구성 요소 자체 (완전히 "관리되지 않음"및 "기본"이 아니기 때문에)으로 인한 크래시가 거의 확실합니다. 하지만 어쩌면 다른 것일 수도 있습니다.

답변

3

하나의 응용 프로그램에서 Application.Run()을 여러 번 사용하면 모든 것이 올바르게됩니까? :) 추한 해킹이나 정상적인 연습?

일부 중 일부는 예상 한대로 작동하지만 완전히 정상적인 방법은 아닙니다.

정확히 Application.Run()이 무엇을하는지 모르겠습니다.

Application.Run은 기본적으로 몇 가지 작업을 수행합니다. 먼저 Windows Forms 용 스레드에 SynchronizationContext 속성을 설치하여 제대로 실행합니다. 그런 다음 Windows에서 스레드로가는 모든 메시지를 처리하는 해당 스레드에서 Windows 메시지 처리를 시작합니다. 이것이 양식이 올바르게 작동하는 것입니다.

특별히 은 (는)으로 잘못되었지만 표준 연습은 아닙니다. 귀하의 설계 목표를 감안할 때, 별도의 스레드 내에서 각 작업을 실행하는 대신 별도의 프로세스을 시작하는 것이 더 나은지 여부에 대해 질문합니다.

+0

+1 거의 모든 추가 'Application.Run' 호출을 본 사람은 UI 스레드를 올바르게 관리하는 방법을 모르기 때문입니다. 여기서는 WebBrowser를 제어하지 않기 때문에 각 인스턴스마다 별도의 UI 스레드를 만들고 싶기 때문에 N 개 모두가 UI 스레드를 공유 할 수 없습니다. 이 때문에 app.run을 적절하게 사용합니다. – Servy

+0

글쎄, 프로세스를 사용하여 나는 그들 사이의 의사 소통이 필요합니다, 그것은 꽤 어려울 것이고 더 이상 예측할 수없는 문제를 초래할 수 있습니다. 그러나'Application.Run()'에 관해서는 약간의 문제가 해결되었습니다. 감사. 파괴 된 문서에 대해 뭔가를하려고 노력할 것입니다.이를위한 임시 해결책이 있어야합니다. – Harry

관련 문제