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
'codememo' 카테고리의 다른 글
| Angular2 RC6: '은(는) 알려진 요소가 아닙니다.' (0) | 2023.05.08 |
|---|---|
| 를 통해 MongoDB에서 인덱스를 만드는 방법.그물 (0) | 2023.05.08 |
| 유효성 검사 오류:잘못된 번들입니다....의 번들에 허용되지 않는 파일 'Frameworks'가 포함되어 있습니다. (0) | 2023.05.08 |
| Express 4.0: req.files를 사용하여 파일 업로드가 정의되지 않았습니다. (0) | 2023.05.08 |
| MongoDB 성능 - 여러 데이터베이스 보유 (0) | 2023.05.08 |