线程在长SP执行中被中止

本文关键字:执行 SP 线程 | 更新日期: 2023-09-27 18:19:09

我创建了一个asp.net页面,它执行了一个很长的sp(在SSMS中大约1小时的sp执行时间)。

有一个Admin。

web。config我添加了:

<httpRuntime maxRequestLength="111264" requestValidationMode="2.0" executionTimeout="10000000" />

也在连接属性中添加:

_cmd.CommandTimeout = 0; // unlimited

函数使用jquery ajax (to ashx)来激活sp(它正在工作并且很好)

jquery调用一个ashx文件来激活sp .

然而,我不希望UI将被阻塞,直到操作结束,所以我在ashx文件中创建了一个线程:

public void ProcessRequest(HttpContext context)    
{
    string xmlFileNameParam = ...
    string bakFileName = ...
    ParameterizedThreadStart ThreadWithParam = dbFuncForThread;
    Thread thread = new Thread(ThreadWithParam);
    thread.IsBackground = false;
    dynamic d = new ExpandoObject();
    d.XmlFileNameParam = xmlFileNameParam;
    d.BakFileName = bakFileName;
    thread.Start(d);
}
public void dbFuncForThread(dynamic d)
{
    // activate the long sp
}

然而,过了一会儿,我看到这个错误在EventLog(和操作停止):**

有问题第259行线程被中止。在System.Threading.Thread。SleepInternal (Int32 millisecondsTimeout) *

为什么?

我给了线程所需的所有环境(连接超时,执行超时)

注:如果我不使用线程并像这样放置正常代码(UI被阻塞):

public void ProcessRequest(HttpContext context)        
{
    string xmlFileNameParam = ...
    string bakFileName = ...
    dynamic d = new ExpandoObject();
    d.XmlFileNameParam = xmlFileNameParam;
    d.BakFileName = bakFileName;
    dbFuncForthread(d);   
}
public void dbFuncForThread(dynamic d  )
{
    //  activate the long sp...
}

所以代码很好,一切都很好。这是怎么回事,为什么是这样,我怎么解它?

线程在长SP执行中被中止

我想你可以重新考虑你的设计,最好使用windows服务来为你做这件事。从webservice传递数据到windows服务,然后执行sp.在web环境中,这种情况的明显问题可能是IISReset或appdomain recycle将中止所有线程。

看起来线程不喜欢等待SP完成这么长时间,这不是SQL调用超时。在c#中异步调用SQL Server存储过程