Как написать асинхронный запрос в Revit-API
Сегодня я хочу углубиться в тему, которая была для меня одновременно сложной и полезной, — написание плагинов для Revit с использованием C#. Хотя я разрабатываю плагины для различных платформ, Revit по-настоящему покорил меня своей универсальностью, во многом благодаря мощному API, разработанному Autodesk
Если вы только начинаете разработку плагинов для Revit, то, скорее всего, столкнетесь с некоторыми трудностями, которые нелегко решить с помощью быстрого онлайн-поиска.
Одним из распространенных препятствий, с которым вы можете столкнуться, является правильное выполнение асинхронных операций. Очень важно правильно обрабатывать эти операции, чтобы перехватывать любые возможные исключения. Чтобы помочь с этим, я написал дополнительный код для управления асинхронностью / ожиданием в рамках одного потока.
Здесь вы видите, как написать вспомогательный класс для этой цели.
/// <summary> /// It helps to perform asynchronous actions in revit, because Async does not work in 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(); } }
Здесь я привожу пример того, как использовать этот вспомогательный класс в ваших проектах.
public void ShowHowExtensionWorks() { object yourObject = new object(); bool result = AsyncTasksExecutor.Execute(() => DoAsyncWorks(yourObject)); } public async Task<bool> DoAsyncWorks(object someObjectsYouCanUse) { await Task.Delay(1000);//Simulate async operation return true; }
авторизуйтесь