c#에서 이벤트를 주 스레드 외에 다른 스레드가 처리하게 하려면 어떻게 하나??
객체.이벤트 += 이벤트 핸들러
이런 식으로 특정 이벤트에 대한 이벤트 핸들러를 지정해주는데
근데 그 이벤트를 다른 스레드(주 스레드 외에 내가 임의로 만들어 준 스레드)에서 처리하게 해주는게 어딨는지
어떻게 함???
c#에서 이벤트를 주 스레드 외에 다른 스레드가 처리하게 하려면 어떻게 하나??
객체.이벤트 += 이벤트 핸들러
이런 식으로 특정 이벤트에 대한 이벤트 핸들러를 지정해주는데
근데 그 이벤트를 다른 스레드(주 스레드 외에 내가 임의로 만들어 준 스레드)에서 처리하게 해주는게 어딨는지
어떻게 함???
처리할 스레드에 리스너를 implement 한다음 그 스레드를 리스너로서 추가하는건 어떨가요
안되지, 함수 내용 자체는 스레드가 실행할 코드에 불과한거고 스레드를 만드는 api는 따로 있는데
내용 같게 하는거하고 같은 스레드에서 실행되는거하고 관련이 없지
요점이 뭐냐? 컨트롤 이벤트를 멀티스레드로 처리하고 싶다고?
아니 그러니까 이벤트를 처리하는 스레드를 주 스레드 말고 다른 스레드로 하는 방법
그러니까 그 이벤트를 통지받아서 처리하는 스레드가 주 스레드 말고 다른 스레드
왜냐면 주 스레드는 이벤트 처리하고 있는 도중에 또 다른 이벤트를 처리해야되는 상황이라
이벤트를 처리하는 스레드를 지정하는 방법을 알고 싶다(언어는 c#, 프레임워크는 .net)
리스너 생성을 다른 스레드에서 하면 될 듯
곰죄인//그렇게 했는데 안 됨
그렇게 해도 주 스레드로 이벤트 날라가는 듯
이런 식으로 해서 잘 쓰고 있는데 Application.Run(new ApplicationContext(subForm));
물론 이건 창 기반 한정이지만
https://stackoverflow.com/questions/6615913/run-event-handlers-in-another-thread-without-threads-blocking
아마 이거 관련됐을 거 같은데 UI thread...Invoke...
지금 스레드 안에서 browser2.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser2_DocumentCompleted); 이렇게 이벤트 핸들러 추가하고
browser2.Navigate((string)url); 이렇게 Navigate 함수 호출했거든?
Navigate 함수 호출하면 웹브라우저 스레드가 생겨서 인수로 넘긴 url에 대한 html 분석해서 이벤트를 내 프로그램으로 보내는건데
html -> html문서
그 이벤트 핸들러 내에서 문자열 찍어도 안찍히는데??
이벤트 발생 안한건데 즉
애초에 browser2 객체 자체가(WebBrower brower2) 스레드 내에 지역 변수로 선언 했거든?? 그럼 스레드 변수라는 뜻이잖아 근데 저 이벤트 내에서 browser2 멤버를 찍어보면 해당 콘텍스트에 없는 변수라고 나오는데?? 이벤트도 그 스레드 내에서 발생하면 콘텍스트에 있어야 되는 거 아님?
그냥...메시지를 보내는 게 빨리 해결할 거 같은데. 어차피 창 띄우는 거면.
아니 창 띄우는게 아니라 이벤트 자체를 그 스레드가 받아야 되는데
그 이벤트 처리하는게 목적이지 창 띄우는게 목적이 아니라
아 저 위에 써놓은 Application.Run(new ApplicationContext(Form)) 이게 그거임. 저걸 자식 스레드에서 실행하면 자식 스레드에 메시지 펌프가 새로 생김.
그럼 스레드 진입함수에 Applicaion.Run(); 이것만 쓰면 됨??
저거 쓰고 처음 받는 이벤트는 뭐임??
스레드를 만들었다고 해서 메시지 펌프가 생기는 게 아니니까, 아마 저 상황은 메인 메시지 펌프가 활성화돼서 발생하는 거 같은데.
아 이렇게 하니깐 되네 땡큐~~~