mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-13 06:04:30 +08:00
refactor(game): 拆分配置热重载启动流程
- 重构 GameConfigBootstrap 的热重载启动流程,提取状态准备、结果提交与失败回滚辅助方法 - 保持现有锁保护、异常路径与监听句柄释放语义不变,消除 StartHotReload 的 MA0051 warning
This commit is contained in:
parent
9deafac234
commit
9ce634ed1c
@ -210,67 +210,16 @@ public sealed class GameConfigBootstrap : IDisposable
|
|||||||
/// </exception>
|
/// </exception>
|
||||||
public void StartHotReload(YamlConfigHotReloadOptions? options = null)
|
public void StartHotReload(YamlConfigHotReloadOptions? options = null)
|
||||||
{
|
{
|
||||||
YamlConfigLoader loader;
|
var loader = BeginHotReloadStart();
|
||||||
lock (_stateGate)
|
|
||||||
{
|
|
||||||
ThrowIfDisposedCore();
|
|
||||||
|
|
||||||
loader = _loader ?? throw new InvalidOperationException(
|
|
||||||
"Hot reload can only be started after the initial config load succeeds.");
|
|
||||||
|
|
||||||
if (_isStartingHotReload || _hotReload != null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Hot reload is already enabled.");
|
|
||||||
}
|
|
||||||
|
|
||||||
_isStartingHotReload = true;
|
|
||||||
_stopHotReloadAfterStart = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
IUnRegister? hotReload = null;
|
IUnRegister? hotReload = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
hotReload = loader.EnableHotReload(Registry, options);
|
hotReload = loader.EnableHotReload(Registry, options);
|
||||||
|
hotReload = CompleteHotReloadStart(hotReload);
|
||||||
var shouldStop = false;
|
|
||||||
lock (_stateGate)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ThrowIfDisposedCore();
|
|
||||||
|
|
||||||
// Stop/Dispose may arrive while the watcher is being created. In that
|
|
||||||
// case, release the new handle immediately instead of publishing it.
|
|
||||||
if (_stopHotReloadAfterStart)
|
|
||||||
{
|
|
||||||
shouldStop = true;
|
|
||||||
_stopHotReloadAfterStart = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_hotReload = hotReload;
|
|
||||||
hotReload = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
_isStartingHotReload = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldStop)
|
|
||||||
{
|
|
||||||
hotReload?.UnRegister();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
lock (_stateGate)
|
ResetHotReloadStartAfterFailure();
|
||||||
{
|
|
||||||
_isStartingHotReload = false;
|
|
||||||
_stopHotReloadAfterStart = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
hotReload?.UnRegister();
|
hotReload?.UnRegister();
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@ -332,4 +281,70 @@ public sealed class GameConfigBootstrap : IDisposable
|
|||||||
throw new ObjectDisposedException(nameof(GameConfigBootstrap));
|
throw new ObjectDisposedException(nameof(GameConfigBootstrap));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private YamlConfigLoader BeginHotReloadStart()
|
||||||
|
{
|
||||||
|
lock (_stateGate)
|
||||||
|
{
|
||||||
|
ThrowIfDisposedCore();
|
||||||
|
|
||||||
|
var loader = _loader ?? throw new InvalidOperationException(
|
||||||
|
"Hot reload can only be started after the initial config load succeeds.");
|
||||||
|
|
||||||
|
if (_isStartingHotReload || _hotReload != null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Hot reload is already enabled.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_isStartingHotReload = true;
|
||||||
|
_stopHotReloadAfterStart = false;
|
||||||
|
return loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IUnRegister? CompleteHotReloadStart(IUnRegister? hotReload)
|
||||||
|
{
|
||||||
|
var shouldStop = false;
|
||||||
|
lock (_stateGate)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ThrowIfDisposedCore();
|
||||||
|
|
||||||
|
// Stop/Dispose may arrive while the watcher is being created. In that
|
||||||
|
// case, release the new handle immediately instead of publishing it.
|
||||||
|
if (_stopHotReloadAfterStart)
|
||||||
|
{
|
||||||
|
shouldStop = true;
|
||||||
|
_stopHotReloadAfterStart = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_hotReload = hotReload;
|
||||||
|
hotReload = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isStartingHotReload = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldStop)
|
||||||
|
{
|
||||||
|
hotReload?.UnRegister();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hotReload;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetHotReloadStartAfterFailure()
|
||||||
|
{
|
||||||
|
lock (_stateGate)
|
||||||
|
{
|
||||||
|
_isStartingHotReload = false;
|
||||||
|
_stopHotReloadAfterStart = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user