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();
}
编辑:寻址答案
想到这些事情就把我带到了这个问题,谁杀了我的线程?
PS.用蜡烛棒在客厅里不是Lady Goldent :)
Joh*_*ers 13
你的线程可能只是抛出异常.尝试放置一个try/catch块DoSomethingForALongLongTime,看看它拿起了什么.
更新:我之前没有注意到您是从Web服务器启动它.这可能是一个非常糟糕的主意.特别是,单独的线程是否使用从中派生的任何信息HttpContext.Current?这将包括Request,Response,Session等,以及从页面的任何信息.
这很糟糕,因为只要请求持续,这些事情就会持续下去.一旦请求结束,它们就会变得无效,至少可以说.
如果您需要从Web应用程序或Web服务中启动长时间运行的线程,那么您应该创建一个简单的Windows服务并在其中托管WCF服务.然后让网页将执行任务所需的所有信息发送到服务.该服务甚至可以使用MSMQ作为传输,这将确保即使服务繁忙也不会丢失任何消息.
获取更多信息的潜在方法:附加调试器并中断线程终止.根据您的线程终止的方式,这可能不起作用.
sxe et以打开线程退出.loadby sos mscorsvr,.loadby sos mscorwks或.loadby sos clr应该工作),然后运行!clrstack(请参阅!help其他sos命令)如果你从其他线程中获得很多噪音,如果它不是你关心的线程ID,脚本windbg会在断开后继续.
编辑:如果您认为线程正在进程中终止,您还可以在TerminateThread(bp kernel32!TerminateThread)和ExitThread(bp kernel32!ExitThread)上设置断点以捕获杀手的堆栈.