// 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; }
}
}