【发布时间】:2023-07-31 12:29:01
【问题描述】:
我一直在努力让 Windows 服务在有新版本时自动重启应用程序。我的代码在下面,它确实有效。我的问题是:这里的某个地方有一个很大的禁忌吗?我是在单独的线程上创建应用程序域的新手,我想知道是否有更优雅的方式来实现这一点。我还担心我可能对如何处理这个问题有一个很大的盲点。任何建议表示赞赏。
一般有两个部分:运行的 Windows 服务,在不同的进程中启动我的应用程序,然后轮询以检测该应用程序的新版本何时可用。第二部分是启动、更新、重启的实际应用程序。
首先,当服务启动时,它会调用 LoadApp() 以便应用程序开始运行。
private void LoadApp()
{
// ** appDomainSetup here **
this._appDomain = AppDomain.CreateDomain("MyUpdatedApp", AppDomain.CurrentDomain.Evidence, appDomainSetup);
this._tokenSource = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
try
{
this._appDomain.ExecuteAssembly(assembly);
}
catch (AppDomainUnloadedException ex)
{
Debug.WriteLine(ex.ToString());
}
}, _tokenSource.Token);
}
然后,每隔 10 秒,计时器就会调用这个方法:
private void Process(object stateInfo)
{
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Check for new binaries. If new, copy the files and restart the app domain.
if (!NewAppVersionReady()) { return; }
DeleteFiles();
CopyFiles();
RestartAppDomain();
}
finally
{
Monitor.Exit(_locker);
}
}
RestartAppDomain() 看起来像这样。请注意,当我在此方法的第二行卸载应用程序域时出现异常。 (我通过捕获异常并基本上忽略它来解决这个问题。)
private void RestartAppDomain()
{
this._tokenSource.Cancel();
AppDomain.Unload(this._appDomain);
LoadApp();
}
编辑:我发现 AppDomain.Unload() 行是不必要的。没有它,该服务仍会使用新版本更新应用程序,然后启动新版本的应用程序。我最担心的是在令牌源上调用 Cancel()。我希望应用能够正常关闭,而不是仅仅强制关闭。
【问题讨论】:
标签: c#-4.0 task appdomain restart