Exe 保持打开状态,锁定文件

我使用 TeamCity,它反过来调用 msbuild (。NET 4).我有一个奇怪的问题,在构建完成之后(它是否成功似乎并不重要) ,msbuild.exe 保持打开状态,并锁定其中一个文件,这意味着每次 TeamCity 尝试清除其工作目录时,它都会失败,无法继续。

这种情况每次都会发生。

我在这个问题上真的迷路了,所以我会尽量提供更多的细节。

  • 服务器是英特尔酷睿 i7,2 GB 内存,与 WindowsServer2008标准64位 SP2。
  • 在 TeamCity 中,msbuild 运行程序使用 /m命令行参数配置(这意味着使用多个核)
  • 所涉及的文件是 一直都是相同的外部 DLL,该外部 DLL 在。NET 项目,在路径 External Tools\Telerik\Telerik.Reporting.Dll中。(还有其他几个。包含在 External Tools目录中的类似路径结构的 DLL 文件从不会导致此问题)。目前,这是与试用版本的 Telerik 报告,以防有任何差异。
  • 当问题发生时,任务管理器中总是列出了几个 msbuild.exe *32进程: 我相信有7个。使用 Process Explorer,它们看起来都像顶级进程(没有父进程)。它们都使用20-50MB 内存和0.0% 的 CPU。
  • 如果我等待1-3分钟,msbuild.exe 进程会自动退出,然后 TeamCity 可以正确地更新工作目录。
  • 如果我手动终止 msbuild 进程,TeamCity 的更新将立即再次工作。
  • 索引服务在 Windows 中是关闭的(尽管前两点几乎证实了是 msbuild.exe 导致了这个问题)。
  • 在 Telerik.reporting.dll 上没有特殊的属性,唯一的 SVN 属性是 svn:mime-type = application/octet-stream

以前有人碰到过这个吗?

37432 次浏览

Use msbuild with /nr:false.

Briefly: MSBuild tries to do lots of things to be fast, especially with parallel builds. It will spawn lots of "nodes" - individual msbuild.exe processes that can compile projects, and since processes take a little time to spin up, after the build is done, these processes hang around (by default, for 15 minutes, I think), so that if you happen to build again soon, these nodes can be "reused" and save the process setup cost. But you can disable that behavior by turning off nodeReuse with the aforementioned command-line option.

See also:

To disable node reuse within Visual Studio, you must use an environment variable:

MSBUILDDISABLENODEREUSE=1