当前位置: 首页 > 编程语言 > C#

如何知道谁杀了我的线程分享

时间:2023-04-10 22:07:21 C#

如何知道谁杀了我的线程我有一个刚刚被放逐的线程..我想知道谁杀了我的线程以及为什么。当我的线程被操作系统杀死时会发生这种情况,但我想确认这一点,并且如果可能的话,知道它为什么会杀死它。至于线程,我可以断言它在死之前至少有40分钟的执行时间,但它在5分钟内突然死了。publicvoidRunWorker(){Threadworker=newThread(delegate(){try{DoSomethingForALongLongTime();}catch(Exceptione){//从不记录任何内容:(LogException(e);throwe;}});worker...room,isn'tLadyGoldent?许多人(包括我自己在内)都指出在IIS中托管一个长时间运行的线程是个坏主意。你的线程将在IIS的“工作进程”中,这些进程会定期终止(由IIS回收),这将导致您的线程死亡。我建议您尝试关闭IIS工作进程回收,看看这是否有所作为。您可以在此处找到更多信息。您的线程可能只是抛出异常。尝试将围绕DoSomethingForALongLongTime的try/catch块并查看它拾取的内容。更新:之前我没有注意到你是从Web服务器启动它的。这可能是一个非常糟糕的主意。特别是,使用从HttpContext.Current派生的任何信息的单独线程是什么?这将包括请求、响应、会话等,以及页面中的任何信息。这很糟糕,因为只要请求持续,这些东西就会持续存在……至少可以说,一旦请求结束,它们就会变得无效。如果您需要从Web应用程序或Web服务中启动长时间运行的线程,那么您应该创建一个简单的Windows服务并在其中托管WCF服务。然后让网页将执行任务所需的所有信息发送给服务。该服务甚至可以使用MSMQ作为传输,这将确保即使服务繁忙也不会丢失任何消息。获取更多信息的潜在方法:附加调试器并在线程终止时中断。根据您的线程终止方式,这可能不起作用。如果您尚未下载适用于Windows的调试工具,请运行windbg.exe,附加到您的进程,输入windbg,键入sxeet以在调试器中断时启用线程退出,检查系统状态、其他线程等。要获取托管堆栈,请加载sos.dll(.loadbysosmscorsvr、.loadbysosmscorwks或.loadbysosclr应该可以工作),然后运行??!clrstack(有关其他sos命令,请参阅!help)不是您关心的线程ID,脚本windbg将在断开连接后继续。编辑:如果您认为线程在进程中终止,您还可以在TerminateThread(bpkernel32!TerminateThread)和ExitThread(bpkernel32!ExitThread)上设置断点以捕获杀手的堆栈。我不知道答案,但有一些想法:UPDATE你说:线程是由web服务器创建的,它继续运行如果线程在asp.net中运行,可能是asp时线程被杀死了.networker进程回收,它会定期执行。您可以尝试关闭工作流程回收,看看是否有任何不同。您的编辑显示了答案:这是管家网络服务器。您如何管理这些线程?Web服务器环境并不是专门为托管长期存在的进程而设计的。事实上,它可能被配置为每40分钟停止一个失控的网站?编辑:为了快速修复,最好的机会是设置worker.IsBackground=false;因为您当前设置为true允许系统杀死不等待您的bgw的父线程。另一方面,在ASP.NET应用程序中使用BackgroundWorker没有多大意义,它适用于WinForms和WPF。最好为此创建一个单独的线程,因为您正在更改一些线程属性。ThreadPool(Bgw)线程已弃用。该过程可能会终止。这就是worker.IsBackground=true;旨在做,当主线程退出时杀死你的线程。只有前台线程runnnig才能运行后台线程。一旦所有前台线程都结束,任何仍在运行的后台线程都将被中止。如果检查异常没有发现任何有用的信息,请让您的线程代码在关键点写入日志文件。然后您将能够确切地看到它停止工作的时间,并希望知道为什么。一个简单的答案是:“凶手没有留下名片”;)希望这会有所帮助。可以尝试增加web.config中配置system.webhttpRuntime的executionTimeout值(.NET4.0中默认值为110秒,对应http://msdn.microsoft.com/en-us/library/的90秒)在)e1f13641.aspx)。您可以尝试动态更改它Server.ScriptTimeout=300(请参阅http://www.beansoftware.com/ASP.NET-Tutorials/Long-Operations.aspx)。这个参数没有帮助,那么我认为你有一个问题,比如从IIS回收线程。怎么看这个参数的默认值比典型的线程实时要少很多。我认为,你的问题有另一种性质,但只是为了确定......你为什么要为线程设置单元状态?您在工作线程中使用了哪些COM对象?您是否有一个非托管代码来完成大部分工作并且您可以插入一些?我想你应该有更多关于SomethingForALongLongTime的信息来解决这个问题。还有一个建议。你可以在调用SomethingForALongLongTime()之后插入一行代码吗?SomethingForALongLongTime();确保SomethingForALongLongTime不会无一例外地结束?更新:为了绝对确保您的线程不会被IIS杀死,您可以尝试创建一个执行SomethingForALongLongTime();的进程。而不是使用线程。当您调用RunWorker()时,您可以将对该线程的引用添加到列表中。一旦你检测到你的线程已经死亡,你可以检查线程的状态,也许它会揭示它是如何死亡的。或者也许它还没有死,它只是在等待一些资源(比如连接到数据库)。列出runningThreads=...publicvoidRunWorker(){Threadworker=newThread(delegate()..runningThreads.add(worker);worker.Start();}publicvoidcheckThreads(){for(Threadt:runningThreads){Console.WriteLine("ThreadState:{0}",t.ThreadState);}}它可能抛出各种无法捕获的异常之一,包括StackOverflow或OutofMemory。这些是最难追踪的异常。内存消耗是什么这个线程运行时的样子?你能用内存分析器看看它是否失控了吗?你能在内部循环中添加一些日志记录吗?如果你有递归方法,添加一个计数器并抛出异常如果它递归了不可能的次数。您是否正在使用可能导致大对象堆碎片的大对象(内存不足错误,即使您没有真正退出)。您应该使用大量调试日志检测DoSomethingForALongLongTime(),这样你就可以找到你的代码停止执行的地方。或者附加一个调试器并在所有第一次机会异常时中断。使用AsyncTasks在asp.net中长时间运行尝试使用应用程序域UnhandledException事件:http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx如果您错过了一些异常,它可能会给您一些信息以上是C#学习教程:Howtoknowwhokilledme跟帖分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注-本文来自网络收集,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: