如何知道谁杀了我的线程

mca*_*ral 28 .net c# asp.net multithreading iis-5

我有一个只是放逐的线程..我想知道是谁杀了我的线程,为什么.

它发生在我身上我的线程被操作系统杀死,但我想确认一下,如果可能的话就知道它为什么要杀了它.

至于线程,我可以断言它在死亡前至少有40分钟的执行时间,但它突然在5分钟内死亡.

public void RunWorker()
{
    Thread worker = new Thread(delegate()
    {
        try
        {
            DoSomethingForALongLongTime();
        }
        catch(Exception e)
        {
           //Nothing is never logged :(
           LogException(e);
           throw e;
        }
    });

    worker.IsBackground = true;
    worker.SetApartmentState(System.Threading.ApartmentState.STA);
    worker.Start();
}
Run Code Online (Sandbox Code Playgroud)

编辑:寻址答案

  • 尝试/捕获可能的例外:
    它已实施,它没有捕获:(
  • 主线程死亡:
    此线程由Web服务器创建,该服务器继续运行
  • 工作完成:
    工作没有完成,因为它最终会影响数据库,我可以在线程死亡时检查它是否已完成.

想到这些事情就把我带到了这个问题,谁杀了我的线程?

PS.用蜡烛棒在客厅里不是Lady Goldent :)

And*_*son 20

各种各样的人(包括我在这里)指出,在IIS中托管一个长期运行的线程是一个坏主意.您的线程将在IIS"工作进程"中运行.IIS会定期终止(回收)这些进程,这会导致您的线程死亡.

我建议你尝试关闭IIS工作进程回收,看看是否有所作为.您可以在此处找到更多信息.


Joh*_*ers 13

你的线程可能只是抛出异常.尝试放置一个try/catch块DoSomethingForALongLongTime,看看它拿起了什么.


更新:我之前没有注意到您是从Web服务器启动它.这可能是一个非常糟糕的主意.特别是,单独的线程是否使用从中派生的任何信息HttpContext.Current?这将包括Request,Response,Session等,以及从页面的任何信息.

这很糟糕,因为只要请求持续,这些事情就会持续下去.一旦请求结束,它们就会变得无效,至少可以说.

如果您需要从Web应用程序或Web服务中启动长时间运行的线程,那么您应该创建一个简单的Windows服务并在其中托管WCF服务.然后让网页将执行任务所需的所有信息发送到服务.该服务甚至可以使用MSMQ作为传输,这将确保即使服务繁忙也不会丢失任何消息.

  • @Downvoter:如果你不说为什么你投票,那么没有人关心你的想法. (3认同)

Chr*_*ich 5

获取更多信息的潜在方法:附加调试器并中断线程终止.根据您的线程终止的方式,这可能不起作用.

  1. 如果您还没有Windows,请下载适用于Windows的调试工具
  2. 运行windbg.exe,附加到您的进程
  3. 打破windbg,键入sxe et以打开线程退出
  4. 当调试器中断时,检查系统状态,其他线程等.
  5. 要获取托管堆栈,请加载sos.dll(.loadby sos mscorsvr,.loadby sos mscorwks.loadby sos clr应该工作),然后运行!clrstack(请参阅!help其他sos命令)

如果你从其他线程中获得很多噪音,如果它不是你关心的线程ID,脚本windbg会在断开后继续.

编辑:如果您认为线程正在进程中终止,您还可以在TerminateThread(bp kernel32!TerminateThread)和ExitThread(bp kernel32!ExitThread)上设置断点以捕获杀手的堆栈.