lambda logoLambda
  • Blog

  • ⭐ Planes

  • Empresas

Campus virtual
lambda logoLambda

Ofrecemos una amplia gama de cursos en línea de gestión y automatización de procesos BIM diseñados por expertos.

FacebookInstagramLinkedInYouTube

Cursos

  • Gestión de Proyectos BIM
  • Automatización con Dynamo
  • Python Aplicado a la Automatización en BIM
  • Automatización en Revit con C# y la API de Revit
  • Todos los cursos

Enlaces rápidos

  • Academia
  • Blog
  • Planes
  • Empresas

Contacto

  • Lima, Perú
  • contacto@lambda.com.pe
  • (+51) 969 649 907
Libro de Reclamaciones

Libro de Reclamaciones

Conforme a la Ley N° 29571

📕 Acceder al Libro de Reclamaciones

© 2025 Lambda. Todos los derechos reservados.

Términos y condicionesPolítica de privacidad

Tiempo de lectura: ~ 4 minutos

Hilos en Revit y Cómo Crear un Hilo usando la API de Revit

En este artículo aprenderás a crear hilos en Revit utilizando la API de Revit y el lenguaje de programación C#. Descubre cómo ejecutar código en segundo plano y cómo modificar el documento de Revit de forma segura.

# Revit

# API

# C#

Actualizado 10 de marzo de 2025

Contenido

- ¿Por qué Revit no permite modificar el documento en hilos secundarios?- Cómo crear un hilo en Revit- Cómo ejecutar código en segundo plano y luego actualizar Revit- Cuándo usar hilos en Revit- Conclusiones
Regresar a blogs

En Autodesk Revit, la API está diseñada para ejecutarse en un único hilo principal. Esto significa que todas las modificaciones en el documento deben hacerse en el contexto de la API de Revit, es decir, en el hilo principal de Revit.

Sin embargo, hay situaciones en las que es útil realizar operaciones en segundo plano (por ejemplo, llamadas a APIs, cálculos intensivos, etc.). Para esto, se pueden crear hilos secundarios que no modifiquen directamente el documento.

¿Por qué Revit no permite modificar el documento en hilos secundarios?

Revit es una aplicación basada en un bucle de eventos y no es un programa de múltiples hilos en su núcleo. Cuando intentas modificar el documento desde otro hilo, Revit no puede garantizar la sincronización adecuada, lo que puede provocar errores o inestabilidad.

💡 Ejemplo de error común al modificar Revit desde un hilo secundario:

1"Starting a transaction from an external application running outside of API context is not allowed"

Esto ocurre porque la API está protegiendo la integridad del documento.

Cómo crear un hilo en Revit

Para ejecutar código en segundo plano en Revit, se puede usar:

  • Task.Run(() => { ... }) → Para operaciones asíncronas sin modificar el documento.
  • Thread de System.Threading → Para control manual de hilos (menos común hoy en día).
  • BackgroundWorker → Alternativa más estructurada para tareas largas.

Ejemplo 1: Crear un hilo con Task.Run()

Si necesitas hacer una operación en segundo plano (pero sin modificar Revit), usa Task.Run():

1using System;
2using System.Threading.Tasks;
3using Autodesk.Revit.Attributes;
4using Autodesk.Revit.DB;
5using Autodesk.Revit.UI;
6
7[Transaction(TransactionMode.Manual)]
8public class AsyncExample : IExternalCommand
9{
10    public Result Execute(ExternalCommandData commandData, 
11                          ref string message, 
12                          ElementSet elements)
13    {
14        // Inicia un hilo en segundo plano
15        Task.Run(() =>
16        {
17            Task.Delay(3000).Wait(); // Simula una espera de 3 segundos
18            TaskDialog.Show("Hilo Secundario", "Este mensaje se ejecuta en un hilo diferente.");
19        });
20
21        TaskDialog.Show("Hilo Principal", "Este mensaje se ejecuta en el hilo principal de Revit.");
22        return Result.Succeeded;
23    }
24}

🔹 Salida esperada:

  • 1️⃣ Primero aparece el cuadro de diálogo "Hilo Principal".
  • 2️⃣ Luego, después de 3 segundos, aparece "Hilo Secundario".
Importante
Este código no modifica el documento de Revit. Solo ejecuta código en otro hilo.

Cómo ejecutar código en segundo plano y luego actualizar Revit

Si necesitas hacer cálculos en un hilo secundario y luego modificar el documento de Revit, debes usar ExternalEvent.

Ejemplo 2: Crear un ExternalEvent para modificar Revit

Este es el método recomendado cuando necesitas combinar operaciones en segundo plano con modificaciones en Revit:

Crea un IExternalEventHandler para modificar Revit. Ejecuta una tarea en Task.Run() para llamar una API u otros procesos pesados. Llama a _externalEvent.Raise() desde el hilo secundario para ejecutar la transacción en Revit.

1using System;
2using System.Diagnostics;
3using System.Threading.Tasks;
4using Autodesk.Revit.Attributes;
5using Autodesk.Revit.DB;
6using Autodesk.Revit.UI;
7
8[Transaction(TransactionMode.Manual)]
9public class AsyncWithRevit : IExternalCommand
10{
11    private static readonly MyExternalEventHandler _handler = new MyExternalEventHandler();
12    private static readonly ExternalEvent _externalEvent = ExternalEvent.Create(_handler);
13
14    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
15    {
16        Task.Run(() =>
17        {
18            Debug.WriteLine("Ejecutando operación en segundo plano...");
19
20            Task.Delay(2000).Wait(); // Simula una espera de 2 segundos
21
22            Debug.WriteLine("Listo. Llamando a Revit para modificar el documento...");
23
24            _externalEvent.Raise(); // Esto ejecutará el código en Revit
25        });
26
27        return Result.Succeeded;
28    }
29}
30
31/// <summary>
32/// Este manejador ejecutará código en el contexto de Revit.
33/// </summary>
34public class MyExternalEventHandler : IExternalEventHandler
35{
36    public void Execute(UIApplication app)
37    {
38        Document doc = app.ActiveUIDocument.Document;
39
40        using (Transaction trans = new Transaction(doc, "Crear Elemento"))
41        {
42            trans.Start();
43
44            // Crear un texto de anotación como ejemplo
45            TextNote.Create(doc, doc.ActiveView.Id, new XYZ(0, 0, 0), "Texto creado desde un hilo secundario", new TextNoteType().Id);
46
47            trans.Commit();
48        }
49    }
50
51    public string GetName() => "MyExternalEventHandler";
52}

📌 Explicación

  • 🔹 Task.Run() ejecuta código en segundo plano.
  • 🔹 Después de 2 segundos, _externalEvent.Raise() se ejecuta en el hilo principal de Revit.
  • 🔹 IExternalEventHandler crea un TextNote en el documento, pero dentro de una transacción válida.

💡 Este método es seguro y evita errores de modificación del documento en hilos secundarios.

Cuándo usar hilos en Revit

Caso¿Se puede hacer en un hilo secundario?Método recomendado
Consultar una API externa✅ SíTask.Run()
Realizar cálculos matemáticos pesados✅ SíTask.Run()
Actualizar la UI (WPF/WinForms)⚠️ DependeDispatcher.Invoke()
Modificar elementos en Revit❌ NoExternalEvent

Conclusiones

  • ✔ No puedes modificar Revit desde un hilo secundario.
  • ✔ Para hacer cálculos en otro hilo, usa Task.Run().
  • ✔ Si necesitas modificar Revit desde un hilo secundario, usa ExternalEvent.
  • ✔ Siempre que interactúes con la UI, usa Dispatcher.Invoke().

Comparte este artículo

Suscribirse para recibir actualizaciones

Recibe semanalmente tutoriales, recursos, noticias sobre temas innovadores dentro del sector construcción y destaca profesionalmente.

Constructor Innovador