我创建了一个执行很长 sp 的 asp.net 页面(在 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 调用一个激活 sp 的 ashx 文件。
但是我不希望 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
}
但是过了一会儿,我在事件日志中看到这个错误(并且操作停止):**
There is a problem line 259Thread was being aborted. at 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 回收将中止所有线程。
关于c# - 线程在长时间的 SP 执行中被中止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8678651/