// RevitHttpControl/App.cs using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using Autodesk.Revit.Attributes; using Autodesk.Revit.UI; using Microsoft.Owin.Hosting; using RevitHttpControl.Services; namespace RevitHttpControl { /// /// Revit 外部应用程序主类 /// [Transaction(TransactionMode.Manual)] public class App : IExternalApplication { /// /// 应用程序单例实例 /// public static App Instance { get; private set; } private IDisposable _webApp; private ExternalEvent _externalEvent; private readonly ConcurrentQueue> _commandQueue = new ConcurrentQueue>(); private readonly CommandHandler _handler = new CommandHandler(); private CancellationTokenSource _cancellationTokenSource; private Task _queueProcessorTask; private readonly string _serverUrl = "http://localhost:9000"; /// /// Revit 启动时调用 /// /// UI 控制应用程序 /// 操作结果 public Result OnStartup(UIControlledApplication app) { try { Instance = this; _cancellationTokenSource = new CancellationTokenSource(); // 创建外部事件 _externalEvent = ExternalEvent.Create(_handler); // 启动HTTP服务器 StartWebServer(); // 启动命令队列处理器 StartQueueProcessor(); // 显示启动成功消息 TaskDialog.Show("RevitHttpControl", $"HTTP 服务器已启动\n" + $"地址: {_serverUrl}\n" + $"健康检查: {_serverUrl}/api/health"); return Result.Succeeded; } catch (Exception ex) { TaskDialog.Show("RevitHttpControl 启动失败", $"启动HTTP服务器时发生错误:\n{ex.Message}\n\n详细信息:\n{ex}"); return Result.Failed; } } /// /// 启动 Web 服务器 /// private void StartWebServer() { try { _webApp = WebApp.Start(_serverUrl); System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Web server started at {_serverUrl}"); } catch (Exception ex) { throw new InvalidOperationException($"无法启动HTTP服务器在地址 {_serverUrl}", ex); } } /// /// 启动命令队列处理器 /// private void StartQueueProcessor() { _queueProcessorTask = Task.Run(async () => { System.Diagnostics.Debug.WriteLine("RevitHttpControl: Command queue processor started"); while (!_cancellationTokenSource.Token.IsCancellationRequested) { try { if (_commandQueue.TryDequeue(out var command)) { _handler.SetCommand(command); _externalEvent.Raise(); // 短暂等待让外部事件有时间执行 await Task.Delay(10, _cancellationTokenSource.Token); } else { // 队列为空时等待更长时间 await Task.Delay(50, _cancellationTokenSource.Token); } } catch (OperationCanceledException) { // 正常的取消操作,退出循环 break; } catch (Exception ex) { // 记录错误但继续运行 System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Error in queue processor: {ex}"); await Task.Delay(1000, _cancellationTokenSource.Token); } } System.Diagnostics.Debug.WriteLine("RevitHttpControl: Command queue processor stopped"); }, _cancellationTokenSource.Token); } /// /// 将命令添加到执行队列 /// /// 要执行的命令 public void EnqueueCommand(Action command) { if (command == null) throw new ArgumentNullException(nameof(command)); if (_cancellationTokenSource?.Token.IsCancellationRequested == true) { throw new InvalidOperationException("应用程序正在关闭,无法添加新命令"); } _commandQueue.Enqueue(command); System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Command enqueued, queue size: {_commandQueue.Count}"); } /// /// 获取队列状态信息 /// /// 队列状态 public QueueStatus GetQueueStatus() { return new QueueStatus { QueueSize = _commandQueue.Count, IsProcessorRunning = _queueProcessorTask?.Status == TaskStatus.Running, IsServerRunning = _webApp != null }; } /// /// Revit 关闭时调用 /// /// UI 控制应用程序 /// 操作结果 public Result OnShutdown(UIControlledApplication app) { try { System.Diagnostics.Debug.WriteLine("RevitHttpControl: Shutting down..."); // 停止队列处理器 StopQueueProcessor(); // 停止Web服务器 StopWebServer(); // 清理任务管理器 CleanupTaskManager(); System.Diagnostics.Debug.WriteLine("RevitHttpControl: Shutdown completed"); return Result.Succeeded; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Error during shutdown: {ex}"); return Result.Failed; } } /// /// 停止命令队列处理器 /// private void StopQueueProcessor() { try { _cancellationTokenSource?.Cancel(); _queueProcessorTask?.Wait(TimeSpan.FromSeconds(5)); _cancellationTokenSource?.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Error stopping queue processor: {ex}"); } } /// /// 停止Web服务器 /// private void StopWebServer() { try { _webApp?.Dispose(); _webApp = null; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Error stopping web server: {ex}"); } } /// /// 清理任务管理器 /// private void CleanupTaskManager() { try { TaskManager.Instance.CleanupExpiredTasks(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Error cleaning up task manager: {ex}"); } } } /// /// 外部事件命令处理器 /// public class CommandHandler : IExternalEventHandler { private Action _command; private readonly object _lock = new object(); /// /// 设置要执行的命令 /// /// 命令 public void SetCommand(Action command) { lock (_lock) { _command = command; } } /// /// 执行命令 /// /// UI应用程序 public void Execute(UIApplication app) { lock (_lock) { try { _command?.Invoke(app); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"RevitHttpControl: Error executing command: {ex}"); // 这里可以添加更详细的错误处理逻辑 } finally { _command = null; } } } /// /// 获取处理器名称 /// /// 处理器名称 public string GetName() => "RevitHttpControl Command Handler"; } /// /// 队列状态信息 /// public class QueueStatus { /// /// 队列大小 /// public int QueueSize { get; set; } /// /// 处理器是否正在运行 /// public bool IsProcessorRunning { get; set; } /// /// 服务器是否正在运行 /// public bool IsServerRunning { get; set; } } }