Я занимаюсь написанием библиотеки 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)
{
}
}
«Сбой» не является подходящей диагностикой. Нет смысла заставлять нас угадывать то, что вы * знаете *, сообщение об исключении и трассировку стека. –