线程在长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...
}
所以代码很好,一切都很好。这是怎么回事,为什么是这样,我怎么解它?
我想你可以重新考虑你的设计,最好使用windows服务来为你做这件事。从webservice传递数据到windows服务,然后执行sp.在web环境中,这种情况的明显问题可能是IISReset或appdomain recycle将中止所有线程。
看起来线程不喜欢等待SP完成这么长时间,这不是SQL调用超时。在c#中异步调用SQL Server存储过程