Performance lente d'Excel Interop dans le thread de travail

J'ai rencontré des performances très lentes d'Excel Interop dans Worker Thread.

Voici mon code dans le projet VSTO, qui lit simplement une valeur de cellule spécifiée (par exemple 'Sheet1! A1'):

private object test(ssortingng sheetRange = "Sheet1!A1") { var targetRange = sheetRange.Split('!'); if (targetRange.Length != 2) { return null; } var sheetname = targetRange[0]; var address = targetRange[1]; var workbook = Application.ActiveWorkbook; var sheet = (Excel.Worksheet)workbook.Worksheets[sheetname]; var cell = sheet.Range[address]; return cell.Value; } 

Lorsque je lance ce code dans le thread UI, cela fonctionne assez rapidement. Mais une fois qu'il est exécuté en thread de travail, la performance est assez terrible (environ x50 – x100 plus lente).

  Thread thread = new Thread(() => { test(); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(int.MaxValue); 

Marshal.ReleaseComObject n'est pas réalisé, car il s'agit d'un code de test.

Y a-t-il des points négatifs dans mon code? OU existe-t-il un moyen d'éviter le problème de performance dans le thread de travail?

Merci

Vous traversez la frontière COM entre deux threads STA. COM doit marquer tous les appels, ce qui peut être très coûteux.

Si vous devez avoir une logique liée à Excel dans un thread différent de celui qui possède votre (s) object (s) Excel original, alors vous devez effectuer le marshaling vous-même. Je fais la logique de fond que vous avez besoin dans ce thread de travail, mais assurez-vous que lorsque vous interagissez avec l'object Excel, vous revenez sur le thread propriétaire, avec toutes datatables dont vous avez besoin pour effectuer les appels sur l'object Excel, de sorte que votre les appels peuvent aller directement au code server COM Excel au lieu d'être mis en place.