Office에서 스레딩 지원
이 문서에서는 Microsoft Office 개체 모델에서 스레딩이 지원되는 방식에 대한 정보를 제공합니다. Office 개체 모델은 스레드로부터 안전하지 않지만 Office 솔루션에서 스레드 여러 개를 사용할 수 있습니다. Office 애플리케이션은 COM(구성 요소 개체 모델) 서버입니다. COM을 사용하면 클라이언트가 임의 스레드에서 COM 서버를 호출할 수 있습니다. 스레드로부터 안전하지 않은 COM 서버의 경우 COM은 동시 호출을 직렬화하는 메커니즘을 제공하므로 언제든지 논리 스레드 하나만 서버에서 실행됩니다. 이 메커니즘을 STA(단일 스레드 아파트) 모델이라고 합니다. 호출이 직렬화되므로 서버가 사용 중이거나 백그라운드 스레드에서 다른 호출을 처리하는 동안 호출자가 일정 기간 동안 차단될 수 있습니다.
적용 대상: 이 항목의 정보는 문서 수준 프로젝트 및 VSTO 추가 기능 프로젝트에 적용됩니다. Office 애플리케이션 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하세요.
스레드 여러 개를 사용할 때 필요한 지식
스레드 여러 개를 사용하려면 최소한 다중 스레딩의 다음 측면에 대한 기본 지식이 있어야 합니다.
Windows API
COM 다중 스레드 개념
동시성
동기화
마샬링
다중 스레딩에 대한 일반 정보는 관리되는 스레딩을 참조하세요.
Office는 주 STA에서 실행됩니다. 이러한 영향을 이해하면 Office에서 스레드 여러 개를 사용하는 방법을 이해할 수 있습니다.
기본 다중 스레딩 시나리오
Office 솔루션의 코드는 항상 주 UI 스레드에서 실행됩니다. 백그라운드 스레드에서 별도의 작업을 실행하여 애플리케이션 성능을 원활하게 처리할 수 있습니다. 목표는 작업 하나 대신 한 번에 작업 두 개를 완료한 다음, 다른 작업을 완료하는 것입니다. 그러면 더욱 원활하게 실행할 수 있습니다(여러 스레드를 사용하는 주된 이유). 예를 들어 주 Excel UI 스레드에 대한 이벤트 코드가 있을 수 있으며 백그라운드 스레드에서는 서버에서 데이터를 수집하고 서버의 데이터로 Excel UI의 셀을 업데이트하는 작업을 실행할 수 있습니다.
Office 개체 모델을 호출하는 백그라운드 스레드
백그라운드 스레드에서 Office 애플리케이션을 호출하면 호출이 STA 경계를 넘어 자동으로 마샬링됩니다. 그러나 백그라운드 스레드에서 호출할 때 Office 애플리케이션이 호출을 처리할 수 있다고 보장하지 않습니다. 여러 가능성이 있습니다.
Office 애플리케이션은 입력할 기회가 있도록 호출에 대한 메시지를 펌핑해야 합니다. 이 작업을 일시 중단하지 않고 무거운 처리를 수행하는 경우 시간이 걸릴 수 있습니다.
다른 논리 스레드가 이미 아파트에 있으면 새 스레드를 입력할 수 없습니다. 이는 논리 스레드가 Office 애플리케이션에 입력된 다음, 호출이 호출자의 아파트로 다시 재진입할 때 자주 발생합니다. 해당 호출이 반환될 때까지 애플리케이션이 차단됩니다.
Excel이 들어오는 호출을 즉시 처리할 수 없는 상태일 수 있습니다. 예를 들어 Office 애플리케이션에 모달 대화 상자가 표시될 수 있습니다.
가능성 2 및 3의 경우 COM은 IMessageFilter 인터페이스를 제공합니다. 서버에서 구현하는 경우 모든 호출은 HandleIncomingCall 메서드를 통해 입력됩니다. 가능성 2의 경우 호출이 자동으로 거부됩니다. 가능성 3의 경우 서버는 상황에 따라 호출을 거부할 수 있습니다. 호출이 거부되면 호출자는 수행할 작업을 결정해야 합니다. 일반적으로 호출자는 IMessageFilter를 구현합니다. 이 경우 RetryRejectedCall 메서드에서 거부 알림을 보냅니다.
그러나 Visual Studio에서 Office 개발 도구를 사용하여 만든 솔루션의 경우 COM interop은 거부된 모든 호출을 COMException("애플리케이션이 사용 중임을 나타내는 메시지 필터")으로 변환합니다. 백그라운드 스레드에서 개체 모델을 호출할 때마다 이 예외를 처리할 수 있도록 준비해야 합니다. 일반적으로 이 준비는 일정 시간 동안 재시도한 다음, 대화 상자를 표시하는 작업입니다. 그러나 백그라운드 스레드를 STA로 만든 다음, 해당 스레드에 대한 메시지 필터를 등록하여 이 사례를 처리할 수도 있습니다.
올바르게 스레드 시작
새 STA 스레드를 만들 때 스레드를 시작하기 전에 아파트 상태를 STA로 설정합니다. 다음 코드 예제에서는 이 작업을 수행하는 방법을 보여 줍니다.
System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);
t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();
자세한 내용은 관리형 스레딩 모범 사례를 참조하세요.
모덜리스 양식
모덜리스 양식을 사용하면 양식이 표시되는 동안 애플리케이션과 상호 작용할 수 있습니다. 사용자가 양식과 상호 작용하고 양식은 닫히지 않고 애플리케이션과 상호 작용합니다. Office 개체 모델에서는 관리형 모덜리스 양식을 지원합니다. 그러나 백그라운드 스레드에서 사용하면 안 됩니다.