2016-12-29 6 views
0

Excel 용 VSTO 추가 기능을 개발 중입니다. 백그라운드 작업자 스레드를 사용하여 백그라운드에서 코드 일부를 실행하여 사용자가 엑셀 시트에서 자유롭게 작업 할 수 있도록했습니다. 코드에서와 같이 시트 이벤트 (셀 변경, 선택 변경) 배경 스레드를 실행 한 후 발사하지 않는 C# addin for excel

내가 세포 변화와 주요 코드에서 sheet_activate 이벤트 핸들러를 사용하여 선택 변경 이벤트에 대한 리스너를 등록 : 배경 작업자 스레드를 실행하기 전에`

private void thisWorkbook_SheetActivate(Object sheet1) 
    { 
     try 
     { 
      if (sheet1 is Worksheet) 
      { 
       Worksheet sheet = sheet1 as Worksheet; 
       sheet.SelectionChange += eventDel_SelectionChange; 
       sheet.Change += eventDel_CellsChange; 
      } 
     } 
     catch (Exception e) 
     { 
      printException(e); 
     } 
    }` 

, 이러한 이벤트는 다음과 같이 트리거 얻고있다 예상했다. 그러나 백그라운드 작업자 스레드를 실행 한 후에는 어떻게 든 이러한 이벤트가 트리거되지 않습니다.

이 문제를 해결하려면 Workbook_SheetActivate을 다시 실행해야합니다. 배경 작업자 스레드를 실행 한 후에는 매번이 작업을 수행해야합니다. 내 백그라운드 작업자의 코드 조각은 이미 워크 시트에있는 데이터를 분석하고 일부 내용을 변경 한 다음 시트의 데이터를 업데이트합니다.

Excel에서 COM (구성 요소 개체 모델) 및 STA (단일 스레드 아파트)를 사용하여 스레드를 실행하는 것으로 알고 있습니다. 즉 한 번에 하나의 스레드 만 아파트에서 실행할 수 있습니다. 이것이 문제의 원인인지 확실하지 않습니다.

누군가 이런 일이 일어나는 이유를 설명해 주시겠습니까? 문제를 해결할 수있는 가능한 해결책은 무엇입니까? 나는 현재 마이크로 소프트 비주얼 스튜디오 2010 및 Microsoft Excel 사전에 2007

감사에서 일하고 있어요

!

답변

0

범위와 같은 Excel 메서드에 액세스하거나 백그라운드 스레드에서 셀을 업데이트하는 경우 문제가 발생합니다. 지금까지 코드가 충돌을 일으키지 않았거나 예외를 throw하지 않은 것은 운이 좋았습니다. 나는 그것이 예외를 던지고 당신이 그것을 잡지 않을 수 있습니다 꽤 확신합니다. 솔루션의 경우, 이벤트 핸들러에서 원하는 시트의 모든 데이터를 가져온 다음 백그라운드 스레드에서 해당 "데이터"를 사용하고 bgnd 스레드에서 Excel UI에 액세스하지 않아야합니다. 스레드가 작업을 끝내면 기본 UI 스레드에서 메소드를 호출하는 방법이 필요합니다. Invoke 대리자를 사용하여 기본 UI 스레드 컨트롤을 업데이트하는 방법에 대한 예제가 많이 있습니다.

+0

안녕하세요, Dgorti, Thanx 입력 용입니다. 사실 나는 던져 예외를 처리하기 위해 IMessage 인터페이스를 구현했습니다. 작업 배경 스레드에서 주 스레드를 호출하는 방법을 설명하는 링크를 통해 나를 도울 수 있습니까? 지금은 GUI의 버튼을 통해 위의 sheetactivate 함수를 호출하고 있습니다. 백그라운드 스레드에서이 함수를 호출하고 그렇게하는 동안 주 스레드를 호출하는 방법이 있습니까 ?? –

+0

또한이 문제가 발생하는 이유는 어디에서도 그럴듯한 설명을 찾을 수 없습니다. 이 문제의 이유를 이해하도록 도와 주시겠습니까? –