线程在长SP执行中被中止?

时间:2011-12-30 10:49:39

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

我创建了一个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...
}

所以代码很好,一切都很好。这是怎么回事以及为什么要解决这个问题?

2 个答案:

答案 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#

相关问题