Hoy quiero profundizar en un tema que ha sido tanto desafiante como gratificante para mí: escribir plugins para Revit usando C#. Aunque desarrollo plugins para diversas plataformas, Revit me ha cautivado realmente por su versatilidad, gracias en gran parte a la poderosa API desarrollada por Autodesk.

Si estás comenzando en el desarrollo de plugins para Revit, es probable que te encuentres con algunos obstáculos que no se resuelven fácilmente con una búsqueda rápida en línea.

Uno de los desafíos comunes que podrías enfrentar es realizar operaciones asincrónicas de manera correcta. Es crucial manejar estas operaciones adecuadamente para capturar cualquier excepción que pueda ocurrir. Para ayudarte con esto, he escrito un código de extensión para gestionar Async/Await dentro de un solo hilo.

Aquí te muestro cómo escribir una clase auxiliar para este propósito.

/// <summary>
/// Ayuda a realizar acciones asincrónicas en Revit, ya que Async no funciona en Revit.
/// </summary>
public static class AsyncTasksExecutor
{
    public static T Execute<T>(Func<Task<T>> action)
    {
        var task = Task.Run(action.Invoke);
        return task.GetAwaiter().GetResult();
    }
    public static T Execute<T>(Func<ValueTask<T>> action)
    {
        var task = Task.Run(async() => await action());
        return task.GetAwaiter().GetResult();
    }
}

Aquí te proporciono un ejemplo de cómo usar esta clase auxiliar en tus proyectos.

    public void ShowHowExtensionWorks()
    {
        object yourObject = new object();

        bool result = AsyncTasksExecutor.Execute(() => DoAsyncWorks(yourObject));
    }

    public async Task<bool> DoAsyncWorks(object someObjectsYouCanUse)
    {
        await Task.Delay(1000);//Simular async operation
        return true;
    }

Me encantaría conocer tus opiniones; si has tenido experiencia trabajando con llamadas asincrónicas en la API de Revit, por favor comparte tus ideas en info@apibim.com