我创建了一个asp.net页面,它执行一个非常长的sp(在SSMS中大约1小时的sp执行时间)。
有一个Admin.aspx可以激活此SP。
web.config中的我添加了:
<httpRuntime maxRequestLength="111264" requestValidationMode="2.0" executionTimeout="10000000" />
也在我添加的连接属性中:
_cmd.CommandTimeout = 0; // unlimited
该函数使用jquery ajax(到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中看到了这个错误(并且操作停止了):**
有一个问题行259Thread正在中止。 在System.Threading.Thread.SleepInternal(Int32 millisecondsTimeout)*
为什么?
我给了线程所需的所有环境(连接超时,执行超时)
P.S。 如果我不使用线程并放置像这样的普通代码(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...
}
所以代码很好,一切都很好。这是怎么回事以及为什么要解决这个问题?
答案 0 :(得分:0)
我认为您可能会重新考虑您的设计,更好地使用Windows服务为您执行此操作。从webservice传递数据到执行sp的windows服务。在Web环境中这种情况的明显问题可能是IISReset或appdomain recycle将中止所有线程。
答案 1 :(得分:0)
这看起来线程不喜欢等待这么长时间才能完成SP,这不是SQL调用超时。您可以只异步调用它,而不是显式启动新线程来调用SP:Asynchronous call of a SQL Server stored procedure in C#?