2012-06-27 2 views
0

Я занимаюсь написанием библиотеки UDF для Excel в C#. У меня будет длинный UDF, поэтому я хочу сделать свой UDF асинхронным, чтобы пользовательский интерфейс Excel оставался пригодным для использования при вызове UDF. Ниже мой код; но он не во время вызова Excel из параллельного потока ...C# COM Добавить В случае сбоя при вызове из потока

[ClassInterface(ClassInterfaceType.AutoDual)] 
[ComVisible(true)] 
[ComDefaultInterface(typeof(IRAPDataAddIn))] 
public class RAPDataAddIn : IRAPDataAddIn 
{ 

    public string GetPositionData(Excel.Range Portfolios, Excel.Range Security) 
    { 





     Excel.Application excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 

     Excel.Range target = (Excel.Range)excelApp.get_Caller(System.Type.Missing); 


     Thread _workerThread = new Thread(new ParameterizedThreadStart(this.GetData)); 
     _workerThread.CurrentCulture = System.Globalization.CultureInfo.CurrentCulture; 
     _workerThread.CurrentUICulture = System.Globalization.CultureInfo.CurrentUICulture; 

     _workerThread.Start(target); 

     return "Getting Data"; 
    } 


    public void GetData(object Range) 
    { 
     Excel.Range target = Range as Excel.Range; 

     Thread.Sleep(1000); 

     object[,] returnData = new object[2,2]; 

     returnData[0, 0] = " FirstThread";  
     returnData[0, 1] = " SecondThread"; 
     returnData[1, 0] = " ThirdThread";    
     returnData[1, 1] = " FourthThread"; 

     var Start = (Excel.Range)target.Worksheet.Cells[1,1]; 
     var End = (Excel.Range)target.Worksheet.Cells[2,2]; 

     Excel.Range r = (Excel.Range)target.Worksheet.Range[Start, End]; 

     try 
     { 
      r.Value2 = returnData; ***//It fails here*** 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
+1

«Сбой» не является подходящей диагностикой. Нет смысла заставлять нас угадывать то, что вы * знаете *, сообщение об исключении и трассировку стека. –

ответ

2

(Отказ от ответственности: я разрабатываю библиотека Excel-ДНК)

Я предлагаю вам реализовать ваш Excel UDF с помощью (бесплатно) Excel-DNA библиотеки , Недавно я добавил экспериментальную поддержку для асинхронных функций, поэтому сейчас самое подходящее время попробовать. Я разместил начальную схему текущей поддержки асинхронной функции здесь: http://exceldna.codeplex.com/wikipage?title=Asynchronous%20Functions&referringTitle=Documentation. Лучшим местом для поддержки Excel-DNA является Excel-DNA Google group.

Есть несколько потенциальных проблем с подходом:

  • Объект Application вы извлекаете с Marshal.GetActiveObject не может быть экземпляром Excel вы работаете под. Если было запущено больше одного экземпляра Excel, это будет последний запуск Excel.

  • Вы не можете просто передать COM-объект «Range» в другой поток - это объект с привязкой к объекту STA, поэтому он не может использоваться из потока, который не является основным потоком Excel, маршалинг потоков.

  • Любой из ваших вызовов COM из другого потока в Excel может завершиться неудачно, если Excel «занят», например, если Excel занят вычислением или пользователь редактирует ячейку или даже имеет кнопку мыши. Поэтому каждый COM-вызов должен иметь дело с возможными исключениями как частью нормальной работы.

Есть несколько способов для осуществления такого рода работы с Excel-ДНК, так что вы должны взглянуть на библиотеку и отправлять сообщения в группу Google, если вам нужно более конкретные указания.

+0

Hi Govert; после вашей рекомендации я начал использовать ExcelDna ... У меня будет долгое время работающий UDF, который будет собирать данные с разных серверов и отдавать их клиентам excel. Таким образом, я могу асинхронно вставлять данные в нужные места, поддерживая ExcelReference (т. Е. В ячейку, откуда была вызвана функция); но я также хочу сохранить исходную формулу в ячейке. Как я могу это сделать ? – Ocean

+0

Похоже, вам нужно взглянуть на новую поддержку Reactive Extensions в Excel-DNA. Это позволит вам легко асинхронно передавать данные в ячейки. Проверьте здесь: http://exceldna.codeplex.com/wikipage?title=Reactive%20Extensions%20for%20Excel и спросите в группе Google здесь: http://groups.google.com/group/exceldna – Govert

Смежные вопросы