using System.Threading; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Photino.NET; using VideoStudy.UI; namespace VideoStudy.App; class Program { [STAThread] static void Main(string[] args) { const string appUrl = "http://localhost:5002"; var serverReady = new ManualResetEventSlim(false); // Start Blazor Server in background thread var serverThread = new Thread(() => { var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); builder.Services.AddVideoStudyUI(); builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri("http://localhost:5000"), Timeout = TimeSpan.FromMinutes(10) }); var app = builder.Build(); app.UseStaticFiles(); app.UseAntiforgery(); app.MapRazorComponents() .AddInteractiveServerRenderMode() .AddAdditionalAssemblies(typeof(Routes).Assembly); app.Lifetime.ApplicationStarted.Register(() => serverReady.Set()); app.Run(appUrl); }); serverThread.IsBackground = true; serverThread.Start(); // Wait for Kestrel to be ready (max 15s) serverReady.Wait(TimeSpan.FromSeconds(15)); // Open native window pointing to local server var window = new PhotinoWindow() .SetTitle("VideoStudy") .SetSize(1280, 800) .SetDevToolsEnabled(true) .Center() .Load(new Uri(appUrl)); window.WaitForClose(); } }