У вас есть проблема с порядком обработки в IIS. Включения на стороне сервера выполняются до обработки сценария VBScript. Используйте другой метод для включения предпочтительного сценария на своей странице -
. Пример в этой ссылке: http://www.4guysfromrolla.com/webtech/022504-1.shtml [ 114]
Пример кода:
<%
Dim strInclude
Dim I_want_to_include_file_1
I_want_to_include_file_1 = True
If I_want_to_include_file_1 = True Then
strInclude = getMappedFileAsString("include1.asp")
Else
strInclude = getMappedFileAsString("include2.asp")
End If
Execute strInclude
%>
Поскольку этот метод не использует встроенное включение IIS, код будет запускаться при запуске страницы, но будет только один файл. включен. Код для функции getMappedFileAsString (filepath) показан ниже. По сути, он захватывает полное содержимое указанного пути к файлу, возвращая содержимое файла в виде строки.
blockquote>Function getMappedFileAsString(byVal strFilename) Const ForReading = 1 Dim fso Set fso = Server.CreateObject("Scripting.FilesystemObject") Dim ts Set ts = fso.OpenTextFile(Server.MapPath(strFilename), ForReading) getMappedFileAsString = ts.ReadAll ts.close Set ts = nothing Set fso = Nothing End Function
проблемы Поточной обработки/параллелизма известно трудно копировать - который является одной из причин, почему необходимо разработать, чтобы избежать или по крайней мере минимизировать вероятности. Это - причина, неизменные объекты так ценны. Попытайтесь изолировать изменяемые объекты к единственному потоку и затем тщательно управлять обменом изменяемыми объектами между потоками. Попытайтесь программировать с дизайном объектной передачи, а не "совместно использованными" объектами. Для последнего используйте полностью синхронизируемые объекты управления (которые легче обосновать о), и постарайтесь не иметь синхронизируемый объект, используют другие объекты, которые должны также синхронизироваться - то есть, попытаться сохранить их сам содержавшими. Ваша лучшая защита является хорошим дизайном.
Мертвые блокировки является самым легким отладить, если можно получить отслеживание стека при заведении в тупик. Учитывая трассировку, большинство которых действительно заводит в тупик обнаружение, легко точно определить причину и затем рассуждать о коде относительно того, почему и как зафиксировать его. С мертвыми блокировками это всегда собирающийся быть проблемой, получающей то же, привязывает различные заказы.
Динамические взаимоблокировки более трудны - способность наблюдать систему, в то время как в состоянии ошибки Ваш лучший выбор там.
Условия состязания имеют тенденцию быть чрезвычайно трудными копировать и еще более трудны определить от ручного обзора кода. С ними путь, который я обычно беру помимо обширного тестирования для тиражирования, должен рассуждать о возможностях и попытаться зарегистрировать информацию, чтобы доказать или опровергнуть теории. Если у Вас есть прямое доказательство повреждения состояния, Вы можете рассуждать о возможных причинах на основе повреждения.
, Чем более сложно система, тем, тяжелее это находить параллелизм ошибки, и рассуждать, об это поведение. Используйте инструменты как JVisualVM и удаленные профилировщики подключения - они могут быть жизненным средством сохранения, если можно соединиться с системой в состоянии ошибки и осмотреть потоки и объекты.
кроме того, остерегайтесь различий в возможном поведении, которые зависят от количества ядер процессора, конвейеров, пропускной способности шины, и т.д. Изменения в аппаратных средствах могут влиять на Вашу способность копировать проблему. Некоторые проблемы только покажут на других одножильного ЦП только на мультиядрах.
Одна последняя вещь, попытайтесь использовать объекты параллелизма, распределенные с системными библиотеками - например, в Java java.util.concurrent
Ваш друг. Запись Ваших собственных объектов управления совместным выполнением трудна и чревата опасностью; оставьте это экспертам, если у Вас есть выбор.
Лучшая вещь, о которой я могу думать, состоит в том, чтобы избегать многопоточного кода, когда это возможно. Кажется, что существует очень немного программистов, которые могут записать ошибке бесплатные многопоточные приложения, и я утверждал бы, что нет никаких кодеров, являющихся способным записать ошибку, бесплатную большой многопоточные приложения.
Разработайте код способ, которым Принцесса рекомендовала для Вашего другого вопроса (Неизменные объекты и передача сообщений Erlang-стиля). Будет легче обнаружить проблемы многопоточности, потому что взаимодействия между потоками будут четко определены.
утверждайте (), Ваш друг для обнаружения условий состязания. Каждый раз, когда Вы вводите критический раздел, утверждаете, что инвариант, связанный с ним, верен (это - то, что CS для). Хотя к сожалению, проверка могла бы быть дорогой и таким образом не подойти для использования в продуктивной среде.
Visual Studio позволяет Вам осматривать стек вызовов каждого потока, и можно переключиться между ними. Ни в коем случае не достаточно отследить все виды поточной обработки проблем, но это - запуск. Много улучшений для многопоточной отладки планируется предстоящий VS2010.
я использовал WinDbg + SoS для поточной обработки проблем в коде.NET. Можно осмотреть блокировки (синхронизируйте blokcs), распараллельте стеки вызовов и т.д.
Кроме дампов катастрофического отказа, техника является обширным входом во время выполнения: где каждый поток регистрирует то, что он делает.
первый вопрос, когда об ошибке сообщают, затем, мог бы быть, "Где файл журнала?"
Иногда Вы видите проблему в файле журнала: "Этот поток обнаруживает недопустимое/неожиданное состояние здесь... и взгляд, этот другой поток делал это, незадолго до и/или просто впоследствии это".
, Если файл журнала не говорит, что происходит, затем принесите извинения клиенту, добавьте достаточно много дополнительных операторы входа к коду, дайте новый код клиенту и скажите фиксацию его после того, как это произойдет еще раз.
блог Tess Ferrandez имеет хорошие примеры использования WinDbg для отладки мертвых блокировок в.NET.
В дополнение к другим хорошим ответам Вы уже добрались: Всегда тестируйте на машине с, по крайней мере, столькими же процессоров / ядра процессора, сколько клиент использует, или поскольку существуют активные потоки в Вашей программе. Иначе некоторые ошибки многопоточности могут быть трудны к невозможному воспроизвести.
Принятие у меня есть сообщения о проблемах, которые трудны воспроизвести меня всегда, находит их путем чтения кода, предпочтительно парное чтение кода, таким образом, можно обсудить потребности семантики/блокировки поточной обработки. Когда мы делаем это на основе проблема, о которой сообщают , я всегда нахожу нас гвоздем одна или несколько проблем справедливо быстро. Я думаю, что это - также довольно дешевая техника для решения тяжелых проблем.
Извините за неспособность сказать Вам нажимать ctrl+shift+f13, но я не думаю, существует что-либо как этот доступный. Но просто думая приблизительно , что проблема, о которой сообщают, на самом деле обычно, дают довольно строгое умение ориентироваться в коде, таким образом, Вы не должны запускать в основном ().
Я думал, что ответ Вы добрались до Вашего , другой вопрос был довольно хорош. Но я буду акцент эти точки.
Только изменяют общее состояние в критическом разделе (Взаимное исключение)
, Получают, привязывает порядок набора, и выпустите их в противоположном порядке.
Использование предварительно создало абстракции каждый раз, когда возможный (Как материал в java.util.concurrent)
кроме того, некоторые аналитические инструменты могут обнаружить некоторые потенциальные проблемы. Например, FindBugs может найти некоторые проблемы поточной обработки в программах Java. Такие инструменты не могут найти все проблемы (они не серебряные пули), но они могут помочь.
Как vanslly указывает в комментарии на этот ответ, изучение хорошо помещенного вывода входа может также очень полезный, но остерегаться Heisenbugs.