Visual Studio: ContextSwitchDeadlock

У меня обычно есть класс, расширяющий PDO, но мой класс довольно обыден. Если я его очищу и протестирую, я отправлю его позже. Однако это решение для вашей системы.

function dbSet($fields, &$values) {
    $set = '';
    $values = array();

    foreach ($fields as $field) {
        if (isset($_POST[$field])) {
            $set .= "`$field` = ?,";
            $values[] = $_POST[$field];
        }
    }

    return rtrim($set, ',');
}

$fields = explode(" ","name surname lastname address zip fax phone date");
$_POST['date'] = $_POST['y']."-".$_POST['m']."-"$_POST['d'];

$query  = "UPDATE $table SET ".dbSet($fields, $values).", stamp=NOW() WHERE id=?";
$values[] = $id;

$dbh->prepare($query);
$dbh->execute($values);  

Это может быть не идеально и может быть использовано для настройки. Он учитывает, что $dbh настроен с помощью PDO Connection. В ожидании любых незначительных проблем синтаксиса, которые я сделал, это должно работать.

EDIT

На самом деле, я думаю, я поеду на ORM (или другой ORM). Когда вы настраиваете модель и добавляете туда всю валидацию, это так же просто, как:

$table = new Table();
$table->fromArray($_POST);
$table->save();

. Это должно легко заполнить содержимое. Это, конечно, с ORM, например, Doctrine.

ОБНОВЛЕНО

Сделал некоторые незначительные изменения в первом коде, например, вернул isset назад и использовал rtrim над substr. Приступая к работе над предоставлением макета класса PDO Extension, нужно только макет, чтобы сделать это, и выполнить некоторые модульные тесты, чтобы убедиться, что он работает.

147
задан SeaDrive 23 February 2009 в 16:47
поделиться

4 ответа

Эти ContextSwitchDeadlock не обязательно означает, что Ваш код имеет проблему, просто что существует потенциал. Если Вы перейдете в Debug > Exceptions в меню и расширитесь эти Managed Debugging Assistants, то Вы найдете ContextSwitchDeadlock, включен. При отключении этого VS больше не будет предупреждать Вас, когда объекты займут много времени для обработки. В некоторых случаях можно законно перенести продолжительную операцию. Также полезно, если Вы отлаживаете и остановились на строке, в то время как это обрабатывает - Вы не хотите, чтобы это жаловалось, прежде чем у Вас был шанс вырыть в проблему.

258
ответ дан GôTô 23 February 2009 в 16:47
поделиться

Это кажется на выполнение этого на основном потоке UI в приложении. Поток UI ответственен за нагнетание сообщений окон как прибытие, и все же потому что Ваш заблокирован в вызовах базы данных, которые это не может сделать так. Это может вызвать проблемы с сообщениями в масштабе всей системы.

необходимо посмотреть на порождение фонового потока для длительной операции и подъема некоторый, "я - занятое" диалоговое окно для пользователя, в то время как это происходит.

13
ответ дан Rob Walker 23 February 2009 в 16:47
поделиться

Если Вы не хотите отключать это исключение, все, что необходимо сделать, должен позволить приложению накачать некоторые сообщения, по крайней мере, один раз в 60 секунд. Это предотвратит это исключение для случая. Попытайтесь назвать Систему. Поточная обработка. Поток. CurrentThread. Соединение (10) время от времени. Существуют другие вызовы, которые можно сделать, которые позволяют сообщениям накачать.

6
ответ дан 23 February 2009 в 16:47
поделиться

Как Pedro сказал, у Вас есть проблема с отладчиком, предотвращающим насос сообщения, если Вы ступаете через код.

, Но если Вы выполняете длительную операцию на потоке UI, затем назовите Приложение. DoEvents (), который явно качает очередь сообщений и затем возвращает управление Вашему существующему методу.

Однако, если бы Вы делаете это, я рекомендовал бы при рассмотрении Вашего дизайна так, чтобы можно было выполнить обработку от потока UI так, чтобы UI остался хорошим и мгновенным.

15
ответ дан Spence 23 February 2009 в 16:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: