Поток находился в процессе прерывания в СП долго выполняется?



Я создал asp.net страница, которая выполняет очень длинный sp (около 1 часа времени выполнения sp в SSMS).



Есть админ.aspx, которые активируют этот SP.



В сети.config я добавил:



<httpRuntime maxRequestLength="111264" requestValidationMode="2.0" executionTimeout="10000000" />


Также в свойствах соединения я добавил:



_cmd.CommandTimeout = 0; // unlimited


Функция использует jQuery ajax (to ashx) для активации sp (он работает и отлично)



Jquery вызывает файл ashx, который активирует sp .



Однако я не хотел, чтобы пользовательский интерфейс был заблокирован до конца операции, поэтому я создал поток в файле 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 была прервана.
в системе.Нарезка резьбы.Нить.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...
}


Итак, код в порядке, и все в порядке. Как и почему это происходит и как я могу это решить?

860   2  

2 ответов:

Я думаю, что вы можете пересмотреть свой дизайн, лучше использовать службу windows, чтобы сделать это за вас. От веб-сервиса передачи данных в службу Windows, которая бы выполнять СП. Очевидная проблема для этого сценария в веб-среде может быть iisreset или appdomain recycle прервет все потоки.

Похоже, потоку не нравится так долго ждать завершения SP, это не тайм-аут вызова SQL. Вместо явного запуска нового потока для вызова SP, можно ли просто вызвать его асинхронно: асинхронный вызов хранимой процедуры SQL Server в C# ?

Comments

    Ничего не найдено.