【问题标题】:Terminating w3wp.exe after finishing debugging in Visual Studio 2012, MVC4在 Visual Studio 2012、MVC4 中完成调试后终止 w3wp.exe
【发布时间】:2013-11-09 01:47:23
【问题描述】:

所以我正在尝试在 MVC4 中调试一个进程。我发送 POST 请求,观察它操作数据库等。但是,在我看到我想看到的信息后,我单击“停止调试”。在任何典型的 GUI .NET 应用程序中,我认为该进程会终止,但它会继续执行。如果我对文件进行任何更改并尝试再次调试,则不会命中断点,因为文件与之前运行的仍在运行的进程相比并没有过期。此时我有 2 个选择 - 让它运行或使用任务管理器终止 w3wp.exe 任务以继续调试。

我已尝试单击调试 -> 全部终止,但进程仍在继续执行。我知道这一点是因为我附加到进程(调试 -> 附加到进程)并且它在整个执行过程中在我的许多断点之一处暂停。

提到我正在使用 Google Chrome 将 POST 请求发送到控制器,所以它可能不会终止,因为我没有使用 IE - 但是,我确实认为有比使用 IE 更好的解决方案浏览器。

为了解决这个问题,我必须进入 Windows 任务管理器并终止 IIS 进程 (w3wp.exe),这看起来非常混乱。有什么想法吗?

【问题讨论】:

  • 我怀疑你一定遗漏了什么。虽然 w3wp.exe 确实不会终止,但当您重新启动调试会话时,它使用您更新的代码(它将编译新的程序集并且 IIS 会自然生成一个将使用您的新文件的新应用程序域)。在没有终止 w3wp.exe 的情况下,在新会话中调试这些新文件应该不会有任何困难。
  • 这就是我的想法,但它继续使用以前编译的二进制文件中的代码。我认为这是因为编译后的二进制文件被 w3wp.exe 锁定,而 VS2012 不会更新被锁定的二进制文件。重要的是要说明执行此过程的时间需要几分钟,因此可能是因为我试图在它仍在执行的时间范围内再次执行它...
  • 如果您的 Web 进程确实需要一段时间,那么您确实可以看到您描述的问题。新的应用程序域仅在为新请求提供服务时才是相关的。如果您尝试进入现有的长时间运行的请求,那么您将看不到您的更改。但是,只是重新运行你正在做的事情有那么麻烦吗?自然,当调用一个方法时——不管它需要多长时间才能完成——我不希望在它完成之前将新编译的代码注入其中。
  • 不需要简单地重新运行该过程(这已经需要 5 - 10 分钟),因为该过程本身与数据库的行为不正确,我需要防止它在我添加错误数据时调试它。我的意思是,我也可以在测试代码时删除所有数据库更新。我只是希望有一个更清洁的解决方案

标签: c# asp.net-mvc debugging asp.net-mvc-4 visual-studio-2012


【解决方案1】:

如果我对文件进行任何更改并尝试再次调试,则不会命中断点,因为文件与之前运行的仍在运行的进程相比没有过期。

修改任何代码文件后,您需要重新构建解决方案,然后再次调试 -> 附加到进程。

还请注意,停止调试并不意味着它会一直杀死进程。它只会杀死 Visual Studio Web 开发服务器或有时带有 Visual Studio 的 IIS Express 进程。在这里你提到了 w3wp.exe。虽然此过程由 IIS 管理。

【讨论】:

  • 所以我使用的是普通的 IIS 而不是 IIS express。您是否建议使用 IIS express 来更好地控制该进程?
  • 不要继续使用 IIS,只要确保在修改任何代码文件后重新构建并附加到进程或再次开始调试(按 F5)。
【解决方案2】:

几个更优雅的方式来重启你的 w3wp 工作进程:

  • 在命令行中,运行“iisreset”
  • 在IIS管理器控制台中,选择对应的应用程序池,点击“回收”

要正常关闭长时间运行的业务逻辑,请尝试 global.asax 中的 Application_Shutdown 事件。

对于不太优雅的方法,ThreadPool 可能会对您有所帮助 - 它上的线程被标记为背景,因此当 w3wp 的主线程退出时,Windows 不会等待它们完成。然而,这种方法并不总是有效,因为 3-rd 方库(尤其是网络)可能会创建非后台线程,这又会延迟关闭。

为了更快更脏,请使用 Environment.Exit,由一些仅调试事件触发。 http://msdn.microsoft.com/en-us/library/system.environment.exit(v=vs.110).aspx

【讨论】:

  • 我尝试了 iisreset,但由于该进程需要几分钟才能执行,因此 iisreset 会停止,直到进程完成执行。如果我可以做一个“iisreset force”,我会更喜欢,但这似乎不太可能
  • 在这种情况下,您的设计有问题。考虑以这种方式修改您的应用程序:1)在后台线程中启动长时间运行的进程,2)继续侦听应用程序回收事件 3)当您知道应用程序即将关闭时尝试正常终止。这是一个相关的帖子:stackoverflow.com/questions/4723573/…
猜你喜欢
  • 2013-04-17
  • 2017-10-03
  • 2013-09-08
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多