----------------------------------

아래코드로 해결

 

일반 스레드를 사용하면  위의 에러메세지가 발생했다. 

스레드발생시  STA(단일 스레드 아파트) 모드로 해결된다.

 

 

Main()
{
Thread = new Thread(new ThreadStart(ThreadFunc));
Thread .SetApartmentState(ApartmentState.STA);
Thread .Start();
}

 

 

void ThreadFunc()
{
//작업내용
}

 

 

 

 

 

 

--> 참고

 

ApartmentState

Thread 클래스에서 ApartmentState라는 것이 있다. VB6에서는 STA만을 지원했다는 것은 익히 알려진 사실이다. 굳이 여기서 VB6를 언급하는 것은 VB6로 작성한 컴포넌트를 닷넷에서 사용할 경우에는 이 ApartmentState를 특별히 지정할 필요가 있다. 이 속성은 COM과의 하위 호환성을 위해서 제공된다고 생각하면 된다.

STA와 MTA

ApartmentState는 STA와 MTA 구조가 있는데, Single Threaded Apartment라는 것은 하나의 쓰레드가 아파트를 소유하는 구조를 갖는다. 즉, 멀티 쓰레드를 제공할 수 없는 구조로 되어 있다. MTA는 Multi Threaded Apartment로 되어 있으며, 하나의 아파트에 여러 쓰레드가 세들어 살 수 있는 구조를 갖으며, 각각의 쓰레드가 독립된 방을 갖는 것이 허용된다. 즉, 멀티 쓰레드를 제공하기에 적합한 구조라고 할 수 있다. 이들을 지정하는 것은 다음과 같다.

    Thread.CurrentThread.ApartmentState = ApartmentState.MTA;
    Thread.CurrentThread.AprartmentState = ApartmentState.STA;

이와 같이 지정하는 방법도 있으며, 특성(attribute)을 사용하여 지정하는 방법도 있다. 이들은 System.STAThreadAttribute와 System.MTAThreadAttribute에 정의되어 있으며, 메소드 앞에 [STAThread] 또는 [MTAThread]와 같이 지정하면 된다. 주의할 점은 이미 시작된 쓰레드에 대해서는 아파트먼트를 지정할 수 없으므로 쓰레드를 시작하기 전(Thread.Start()를 호출하기 전)에 설정해야 한다.

닷넷에서는 MTAThread가 기본 설정이며, 이는 COM 객체와도 잘 맞는다. 다만, VB6로 작성한 DLL에 대해서만 호환성을 위해 STAThread를 사용하여 COM 객체에 대한 현재 쓰레드를 STA로 설정하도록 해야한다.

 

 

Posted by 요지
,