2011-03-04 2 views
0

새 스레드를 만들고 백그라운드 스레드 메서드 내에서 작업을 수행 한 다음 작업을 수행 할 다른 메서드를 호출합니다. C# 스레딩 도움말

browser.SelectList(Find.ById("selStartYear")).SelectByValue(startYear); 

은 내가 InvalidCastException를 얻을 :

myThread = new Thread(new ThreadStart(doWork)); 
      myThread.Start(); 

문제는 그 배경 작업자 방법을 떠날 때 다른 방법으로 이동하고이를 실행하는 것입니다.

백그라운드 작업자 메소드가 완료되면 스레드를 사용하여 작업해야합니까? 스레드를 시작한 것을 볼 수 있지만 호출하는 새로운 메서드에서 중단을 호출하면 프로그램이 일시 중단됩니다.

편집 : 내가 WakiN를 사용하여 전역 범위의 새로운 IE을 만든 해요 : 실패한 방법을 않는이 같은

IE browser = new IE("http://www.website.com/"); 

내 작업자 방법 참조.

+0

이것은 관련없는 오류처럼 보입니다. 전체 코드 샘플을 사용하여 알기가 어렵습니다. – BrokenGlass

+0

좀 더 자세한 정보가 도움이 될 것입니다. 당신의 백그라운드 스레드는 무엇을하고 있습니까? 'browser' 변수는 무엇입니까? 실행 순서를 알기 위해 코드를 조금 더 게시하십시오. –

답변

2

아니요, 실행을 완료 한 스레드에서 정리 작업을 수행 할 필요가 없습니다. 실제로는 Abort으로 절대 호출해서는 안됩니다. 그 방법은 파괴적인 방법이며 즉각적으로 종료되어야하는 스레드에게 Abort으로 심하게 끝내는 것이 더 바람직합니다.

또한 작업이 그리 오래 걸리지 않으면 System.Threading.Tasks에서 사용할 수있는 새로운 Task 클래스를 사용하거나 자신의 스레드를 돌리는 대신 System.Threading.ThreadPool.QueueUserWorkItem()을 사용해야합니다.

그렇다고해서 InvalidCastException 문제에 대한 충분한 정보를 제공하지 않았습니다. 그것이 시도하고있는 캐스트는 무엇입니까? doWork의 본문과 실패한 진술에 사용 된 값 사이의 관계 (있는 경우)는 무엇입니까?

+0

위의 편집을 참조하십시오. –

+0

'Task'를 사용하도록 코드를 변경했습니다. 작업 메서드가 끝날 때까지 기다렸다가 다른 메서드를 버튼에 연결하면 제대로 작동하지만 작업 메서드가 다른 메서드를 호출하면 작동하지 않습니다 (오류가 발생 함). –

+0

@ 닉 : 아직 실패한 캐스트가 무엇인지에 대한 질문에 대답하지 않았습니다. –

0

아담은 스레드 문제에 대한 완전한 대답을 제공했습니다. 나는 또 다른 암시 야. 스레드 (예제 코드에서 볼 수 있듯이)는 백그라운드 스레드가 아닙니다. 또한 모든 멀티 스레드 응용 프로그램은 정상 종료를위한 계획이 필요하다고 생각합니다 (시스템 종료 고려).

캐스팅 오류의 원인을 확인하려면 해당 매개 변수 중 하나가 올바른 유형이 아니기 때문에 해당 코드 줄을 3 줄로 분리하는 것이 좋습니다.

+0

문제를 일으키는 줄 앞과 앞에 몇 개의 중단 점을 설정해 보았습니다. 문제가되는 줄은 문자열을 기대하고 있으며 정확하게 그 줄입니다. 나는 혼란스러워. –

+0

@Nick : 세 줄로 나누고 어떤 매개 변수가 캐스팅 예외를 일으키는 지 알아 내야합니다. 그러면 이유를 쉽게 찾을 수 있습니다. 현재 예외는'startYear' 또는''selStartYear''이거나'Find.ById()'메쏘드의 리턴 값일 수 있습니다 (이것은'browser에 의해 사용됩니다.SelectList()'메서드를 매개 변수로 사용). – Xaqron