Обработка потоков в расширениях IIS ISAPI
Я написал расширение ISAPI на языке C++, предназначенное для запуска кода PowerBuilder в IIS. С помощью инструментария powerbuilder имеет интерфейс, чтобы позволить C++ код, чтобы позвонить напрямую в код с помощью инструментария powerbuilder.
Одна из функций позволяет ему запустить фоновый поток с помощью CreateThread и вернуться к клиенту до завершения фонового потока.
У одного из пользователей возникает проблема, когда, если два клиентских приложения запрашивают одно и то же примерно в одно и то же время, одно из них прерывается в определенной точке кода PowerBuilder, выполняемого фоновым потоком.
В IIS AppPool-это процесс, а каждый запрос-это поток. Если два потока запросов могут успешно запускать код PowerBuilder одновременно, то почему потоки, созданные потоками запросов, не могут успешно работать?
Что я уже пробовал:
Это код, который запускает фоновый поток:
if (RunBackground) { // create the background thread hThread = CreateThread(NULL, 0, BackgroundThread, strArgument, 0, &dwThreadID); if (hThread != NULL) { // wait for background thread to finish setup if (strArgument->hEvent != NULL) { WaitForSingleObject(strArgument->hEvent, INFINITE); } // cleanup delete strArgument; CloseHandle(hThread); CloseHandle(strArgument->hEvent); // set the HTTP status pECB->dwHttpStatusCode = HTTP_STATUS_OK; return HSE_STATUS_PENDING; } }
Функция BackgroundThread инициализирует среду выполнения PowerBuilder и перед вызовом пользовательского кода выполняет следующие действия:
// signal that initialization is done if (strArgument->hEvent != NULL) { SetEvent(strArgument->hEvent); } // release the session pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_DONE_WITH_SESSION, NULL, NULL, NULL);