Поток находился в процессе прерывания в СП долго выполняется?
Я создал 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...
}
Итак, код в порядке, и все в порядке. Как и почему это происходит и как я могу это решить?
2 ответов:
Я думаю, что вы можете пересмотреть свой дизайн, лучше использовать службу windows, чтобы сделать это за вас. От веб-сервиса передачи данных в службу Windows, которая бы выполнять СП. Очевидная проблема для этого сценария в веб-среде может быть iisreset или appdomain recycle прервет все потоки.
Похоже, потоку не нравится так долго ждать завершения SP, это не тайм-аут вызова SQL. Вместо явного запуска нового потока для вызова SP, можно ли просто вызвать его асинхронно: асинхронный вызов хранимой процедуры SQL Server в C# ?
Comments