2010-06-23 2 views
4

저는 (의도적으로) C# 응용 프로그램에서 스레드를 사용하지 않습니다. 사실 내 주요 방법은 [STAThread]이며, 이는 단지 하나의 스레드 만 사용해야한다는 것을 의미한다고 생각합니다.컨트롤이 내가 작업하고있는 스레드와 다른 스레드에 있어야하는 이유는 무엇입니까?

왜이 오류 메시지가 표시됩니까?

크로스 스레드 작업이 유효하지 않습니다. 'messageLog'컨트롤이 생성 된 스레드 이외의 스레드에서 액세스되었습니다. [STAThread]main 방법을 표시

답변

6

System.Threading에 대한 명시 적 호출없이 다른 스레드에서 코드를 실행할 수있는 두 가지 유형이 있습니다. 특히 FileSystemWatcherBackgroundWorker을 염두에 두십시오. 이러한 유형 중 하나를 사용하고 있습니까?

STAThread도 스레드를 생성하는 프로세스의 기능을 제한하지 않습니다. 대신 초기 응용 프로그램 스레드의 COM 아파트 유형을 설정합니다.

+1

System.Timers.Timer another – nos

+0

@Nos 타이머를 사용하고 있습니다. 그게 원인입니다. –

+3

System.Windows.Forms.Timer를 사용하여이 응용 프로그램이 winfoms 응용 프로그램이면 타이머 이벤트를 GUI 스레드로 보냅니다. – nos

2

추가 스레드를 생성 할 수없는 것을 의미하지 않는다.

코드를 트리거하는 항목에 대한 정보를 제공하지 않아서 더 구체적으로 지정할 수 없지만 비동기 코드를 실행할 때마다 다른 스레드에서 발생합니다. 위임자에 BeginInvoke과 같은 작업을 수행하거나 (즉, Begin으로 시작하는 대부분의 메서드는 물론 IAsyncResult - async 메서드를 반환 함) 다른 스레드에서 코드 (및 콜백)를 실행합니다.

상황에 대한 자세한 정보를 제공 할 수 있다면보다 구체적인 조언을 제공 할 수 있습니다.

0

[STAThread]은 응용 프로그램이 단일 스레드임을 나타내지 않습니다. 응용 프로그램은 특정 스레드가 완료하는 데 시간이 많이 소요되는 작업을 기다리는 동안 다른 스레드가 실행할 수 있도록 스레드 방식을 사용함을 나타냅니다.

크로스 스레딩 예외가 발생하는 이유는 좀 더 많은 컨텍스트가 필요합니다. messageLog는 어떤 유형의 컨트롤입니까? 어떤 코드가이 컨트롤에 액세스합니까? 암시 적으로 스레드를 사용하는 다른 컨트롤 (예 : BackgroundWorker)을 사용하고 있습니까?

관련 문제