먼저 웹 브라우저가 자체 작업을 수행하는 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 구성 요소 자체 (완전히 "관리되지 않음"및 "기본"이 아니기 때문에)으로 인한 크래시가 거의 확실합니다. 하지만 어쩌면 다른 것일 수도 있습니다.
+1 거의 모든 추가 'Application.Run' 호출을 본 사람은 UI 스레드를 올바르게 관리하는 방법을 모르기 때문입니다. 여기서는 WebBrowser를 제어하지 않기 때문에 각 인스턴스마다 별도의 UI 스레드를 만들고 싶기 때문에 N 개 모두가 UI 스레드를 공유 할 수 없습니다. 이 때문에 app.run을 적절하게 사용합니다. – Servy
글쎄, 프로세스를 사용하여 나는 그들 사이의 의사 소통이 필요합니다, 그것은 꽤 어려울 것이고 더 이상 예측할 수없는 문제를 초래할 수 있습니다. 그러나'Application.Run()'에 관해서는 약간의 문제가 해결되었습니다. 감사. 파괴 된 문서에 대해 뭔가를하려고 노력할 것입니다.이를위한 임시 해결책이 있어야합니다. – Harry