L'API ne prend pas officiellement en charge le threading (voir ci-dessous) ni la fermeture d'un document actif. Cela dit, une solution de contournement pour fermer un document actif consiste à appeler...
SendKeys.SendWait("^{F4}");
...d'un fil séparé. Cela fonctionne bien, sauf que je dois ouvrir et fermer plusieurs documents en boucle. Si je place un quelconque code après thread, il sera exécuté avant la fermeture du document précédent. J'ai essayé un certain nombre de méthodes standard de rappel de threading, notamment...
Task.Factory.StartNew(() =>
ThreadPool.QueueUserWorkItem(new WaitCallback
AutoResetEvent.WaitOne()
sans succès. Et Thread.Sleep() ne fait que bloquer l'erreur/crash. Quelqu'un a-t-il une idée ?
"Les internes de Revit n'utilisent le multitraitement qu'à quelques endroits isolés. Aucun de ces endroits n'englobe actuellement le code de l'API Revit, ou une partie de celui-ci. Autodesk ne recommande donc pas d'effectuer des appels à l'API Revit à partir de threads parallèles exécutés simultanément. Il se peut qu'une partie de l'API Revit soit suffisamment isolée pour pouvoir être exécutée avec succès à partir d'un tel code de threads dans un environnement de test ; cela ne doit pas être considéré comme une garantie que le même code source fonctionnera pour n'importe quel modèle ou situation, ou qu'une modification future de Revit n'entraînera pas l'arrêt du fonctionnement de ce code."
public void OpenFile()
{
for (int i = 0; i < 3; i++)
{
uiApp.OpenAndActivateDocument(TargetPath(i));
ThreadPool.QueueUserWorkItem(CloseDocProc);
//any code here at all opens the next doc without closing the last
}
}
public void CloseDocProc(object stateInfo)
{
SendKeys.SendWait("^{F4}");
//can run code here
}