using Autodesk.Revit.UI; using System; using System.Collections.Concurrent; using System.Threading.Tasks; namespace RevitTools.Utils.Revit { /// /// 外部事件封装类 /// public class ExEventUtils { /// /// 创建外部事件 /// /// private ExEventUtils(string handleName) { this.Handle = new ExEventHandle(handleName); this.ExEvent = ExternalEvent.Create(this.Handle); } /// /// 外部事件实例 /// private readonly ExternalEvent ExEvent; /// /// 外部事件处理程序 /// private readonly ExEventHandle Handle; /// /// 在外部事件中执行函数, 可以等待函数执行完成 /// /// 要执行的函数 /// 事务组名 /// public async Task InvokeAsync(Action action) { var workItem = new ExEventWorkItem(action); Handle.ExEventQueue.Enqueue(workItem); ExEvent.Raise(); await workItem.CompletionSource.Task; } /// /// 在外部事件中执行函数, 并且可以等待函数执行完成 /// /// /// 要执行的函数 /// public async Task InvokeAsync(Func func) { object func1(UIApplication app) { return func(app); } var workItem = new ExEventWorkItem(func1); Handle.ExEventQueue.Enqueue(workItem); ExEvent.Raise(); var result = await workItem.CompletionSource.Task; return (T)result; } /// /// 获取或创建外部事件处理实例 /// /// 外部事件处理程序名称 /// public static ExEventUtils GetOrCreate(string name = "ScriptPadExEventHandle") { return EventUtils.GetOrAdd(name, new ExEventUtils(name)); } private static readonly ConcurrentDictionary EventUtils = new ConcurrentDictionary(); } }