move ui lifetime to a manager for better lifetime control
All checks were successful
Release / Get Version (push) Successful in 4s
Release / Build and Publish Nuget (push) Successful in 2m21s
Release / Build and Publish Package (push) Successful in 2m58s

This commit is contained in:
zznty
2024-10-23 16:52:10 +07:00
parent 264daf7515
commit d301955609
5 changed files with 50 additions and 21 deletions

View File

@@ -94,27 +94,11 @@ namespace Torch.Server
_server.Init(); _server.Init();
var uiThread = new Thread(() => if (!Config.Autostart && !Config.TempAutostart) return;
{
var ui = new TorchUI(_server);
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
ui.ShowDialog();
});
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.Start();
if (Config.Autostart || Config.TempAutostart)
{
Config.TempAutostart = false; Config.TempAutostart = false;
_server.Start(); _server.Start();
} }
uiThread.Join();
}
} }
public static async Task RunSteamCmdAsync(IConfiguration configuration) public static async Task RunSteamCmdAsync(IConfiguration configuration)

View File

@@ -0,0 +1,37 @@
using System.Threading;
using System.Windows.Threading;
using JetBrains.Annotations;
using Torch.Managers;
namespace Torch.Server.Managers;
public class UiManager(TorchServer torchInstance) : Manager(torchInstance)
{
[CanBeNull] private Thread _uiThread;
[CanBeNull] private Dispatcher _dispatcher;
public override void Attach()
{
_uiThread = new Thread(() =>
{
var ui = new TorchUI(torchInstance);
_dispatcher = Dispatcher.CurrentDispatcher;
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(_dispatcher));
ui.ShowDialog();
});
_uiThread.SetApartmentState(ApartmentState.STA);
_uiThread.Start();
}
public override void Detach()
{
_dispatcher?.InvokeShutdown();
if (Thread.CurrentThread != _uiThread)
_uiThread?.Join();
}
}

View File

@@ -56,6 +56,8 @@ namespace Torch.Server
if (config.EntityManagerEnabled) if (config.EntityManagerEnabled)
AddManager(new EntityControlManager(this)); AddManager(new EntityControlManager(this));
AddManager(new RemoteAPIManager(this)); AddManager(new RemoteAPIManager(this));
if (!ApplicationContext.Current.IsService && !config.NoGui)
AddManager(new UiManager(this));
var sessionManager = Managers.GetManager<ITorchSessionManager>(); var sessionManager = Managers.GetManager<ITorchSessionManager>();
sessionManager.AddFactory(_ => new MultiplayerManagerDedicated(this)); sessionManager.AddFactory(_ => new MultiplayerManagerDedicated(this));

View File

@@ -65,7 +65,8 @@ internal static class AssemblyRewriter
{ {
using var assembly = AssemblyDefinition.ReadAssembly(inputStream, new() using var assembly = AssemblyDefinition.ReadAssembly(inputStream, new()
{ {
AssemblyResolver = resolver AssemblyResolver = resolver,
ReadSymbols = true
}); });
foreach (var fieldDefinition in FindAllToRewrite(assembly.MainModule)) foreach (var fieldDefinition in FindAllToRewrite(assembly.MainModule))
{ {

View File

@@ -293,15 +293,20 @@ namespace Torch
{ {
} }
private bool _disposed = false;
/// <inheritdoc /> /// <inheritdoc />
public virtual void Destroy() public virtual void Destroy()
{ {
if (_disposed) return;
Game.SignalDestroy(); Game.SignalDestroy();
if (!Game.WaitFor(VRageGame.GameState.Destroyed)) if (!Game.WaitFor(VRageGame.GameState.Destroyed))
Log.Warn("Failed to wait for the game to be destroyed"); Log.Warn("Failed to wait for the game to be destroyed");
Game = null; Game = null;
Managers.Detach(); Managers.Detach();
_disposed = true;
} }
#endregion #endregion