2

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

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

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

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

4

2 回答 2

0

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

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

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

于 2013-11-09T05:58:54.083 回答
0

几个更优雅的方式来重启你的 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

于 2013-11-09T06:29:31.917 回答