Можно ли ввести многопоточность в DotNe t без простоты создания новых потоков?
У меня есть цикл из нескольких сотен предметов, которые нужно обработать.
Каждый элемент обрабатывается путем условной установки глобального SQLConnection, при котором элемент обрабатывается с использованием этого SQLConnection как части обработки.
По этой причине крайне важно, чтобы ни один из этих элементов не мог обрабатываться параллельно.
Я ценю, что это не очень хороший дизайн, и я надеюсь исправить это, как только это будет практично.
Однако может показаться, что, несмотря на все мои усилия, этот код испытывает некоторую форму многопоточности. Каким-то образом одна из этих задач вызвала исключение.
Это исключение является нарушением ограничения внешнего ключа, но указывает на то, что оно работало против соединения SQLConnection, к которому не имеет никакого отношения к бизнесу.
Естественно, у меня есть опасения по этому поводу, однако, насколько мне известно, в этом приложении нет многопоточного кода.
Интересно, возможно ли ввести многопоточность без явного создания новых тем?
РЕДАКТИРОВАТЬ:
- VB.Net 3.5SP1
- Консольное приложение + библиотеки классов
- Изредка вызывает веб-сервисы
- Делает вызовы SQL
- ничего особенного. Нет Winforms, нет WPF.
4 ответа
В дополнение к другим, которые были упомянуты: параллельные расширения (PLINQ и параллельная библиотека задач).
Да - использование System.Timers.Timer и / или System.Threading.Timer может вызвать эффект, который вы описываете. Всякий раз, когда таймер отмечает, новый рабочий элемент ставится в очередь в ThreadPool - так что, по сути, у вас есть многопоточная программа без явного создания новых потоков.
Если таймер имеет автоматический сброс (остается включенным после истечения вызванного времени), вы можете одновременно вызвать другой вызов того же обработчика.
Альтернативно задачи (то есть объекты задач) не называются потоками, а являются. Задачи обычно встречаются рядом с лямбда-выражениями, проверьте, есть ли они у вас.
Да, и асинхронные сокеты тоже и все другие асинхронные операции ввода-вывода.
НО:
Вместо того, чтобы пытаться избежать многопоточности любой ценой, не будет ли проще заблокировать? Извините, если вопрос наивный, я могу что-то упустить.
Может быть, ваш код вызывается из сторонней библиотеки. Используя события, другая библиотека может вызывать ваш код из любого количества потоков.
Я предлагаю вам проверить код, который вызывает изменяемый код, и убедиться, что нет подозрительных вызовов в ваш код.