c# - 线程在长时间的 SP 执行中被中止?

标签 c# asp.net multithreading sql-server-2005 timeout

我创建了一个执行很长 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/

相关文章:

c# - WIA 设置页面大小不起作用

C# WPF Xaml : Globally set all text in a view to one color, 和所有背景到另一个

asp.net - 无法加载文件或程序集 'Microsoft.Threading.Tasks.Extensions.Desktop' 或其依赖项之一。参数不正确

Java 的 Swing 线程

Python 线程在 join 后没有关闭

PHP 响应并行请求

c# - 如何制作一个适用于多种形式的变量?

c# - 如何修改控制台文本的前一行?

c# - 如何从 Asp.net MVC 中的 ListBoxFor 选择框返回空列表而不是空列表?

c# - 使用 Javascript 添加控件并从代码隐藏中获取它们的值