codememo

VSTO: 기본 Excel 스레드에서 호출

tipmemo 2023. 5. 8. 22:16
반응형

VSTO: 기본 Excel 스레드에서 호출

엑셀 시트에 처리를 위해 새로운 스레드를 시작하는 버튼이 있습니다.Excel을 변경하려는 경우(예: 다음을 사용하여 셀에 데이터 쓰기)Worksheet.Range("A1").Value = "info";), 메인 UI 스레드를 사용해야 할 것 같습니다.

이것이 어떻게 행해지는가?

일반적으로 Winforms에서 제가 전화를 것입니다.Invoke통제 하에, 하지만.Excel.Application또는Worksheet또는Range개체에 다음이 없습니다.Invoke방법.

UI 스레드에서 이 작업을 '필요' 없이 수행할 수 있으므로 .net이 호출을 마셜링하지만 백그라운드 스레드에서 반복적으로 호출하면 성능 문제가 발생할 수 있습니다.

그러나 특히 .net 3.5가 있는 경우 추가 로드 이벤트에 다음을 추가합니다.

Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;

다음을 추가합니다.

public Dispatcher Dispatcher { get {return _dispatcher;} }

그런 다음 다음으로 이동하여 UI 스레드로 발송할 수 있습니다.

Globals.ThisAddIn.Dispatcher.Invoke(()=>{/*stuff*/});

.net 3.5가 없는 경우 동기화 컨텍스트 사용과 같은 몇 가지 다른 스레드 동기화 기술이 있습니다.디스패처 대신 현재입니다.

Windows Forms를 사용하는 VSTO AddIn에 대한 솔루션입니다.시스템이 필요하지 않습니다.창문들.Forms.사용 컨트롤:


클래스의 초기화 ThisAdd포함:

이 행을 "ThisAddIn_Startup" 함수에 추가합니다.

this.TheWindowsFormsSynchronizationContext = WindowsFormsSynchronizationContext.Current 
                                           ?? new WindowsFormsSynchronizationContext();

새 속성 추가:

public SynchronizationContext TheWindowsFormsSynchronizationContext { get; private set; }

그런 다음 작업자 스레드의 사용량은 다음과 같습니다.

        Globals.ThisAddIn.TheWindowsFormsSynchronizationContext.Send(d =>
        {
            MyMethodToInvoke();
        }, null);   

두 번째 솔루션(테스트되지 않음):다음을 사용할 수도 있습니다.

        var invokerControl = new Control();
        invokerControl.CreateControl(); //Forces the control handle to be created
        invokerControl.Invoke(new MethodInvoker(MyMethodToInvoke));

도움이 되길 바래, 요르그

단추에서 백그라운드 작업자를 시작해 보셨습니까?이렇게 하면 ProgressChanged 및 RunWorkerCompleted 이벤트가 메인 스레드에서 실행되므로 매우 쉽게 실행할 수 있습니다.

Excel/VSTO 환경에서 사용해 본 적은 없지만, 작동하지 않는 이유를 알 수 없습니다.

언급URL : https://stackoverflow.com/questions/5567858/vsto-invoking-on-main-excel-thread

반응형