2015-12-14 3 views
1

Я имею дело с CSV-файлом, который импортируется на стороне клиента. Этот CSV должен содержать некоторую информацию, которая будет предназначена для выполнения обновления в одной из таблиц базы данных моей компании. Моя функция C# обрабатывает файл, ищет ошибки и, если ошибок не обнаружено, он отправляет кучу команд обновления (файлы обычно варьируются от 50 до 100000 строк). До сих пор я выполнял обновление в том же потоке, чтобы выполнить обновление (строка за строкой), но он немного замедлялся, в зависимости от файла, поэтому я решил отправить весь SQL в Azure SQL Queue (которая представляет собой услугу, которая получает множество «сообщений» и запускает код SQL снова в базе данных), так что клиенту не придется ждать, чтобы это было сделано. Он получил немного быстрее, но все еще занимает много времени (из-за запросов к очереди Azure SQL). Поэтому я заметил, что выполнение этого действия в отдельном потоке работало и отправило весь SQL в мою Azure SQL Queue.Безопасно ли выполнять длительное действие в отдельной теме?

Я немного волновался об этом. Действительно ли безопасно выполнять длительные действия в отдельных потоках? Это надежный?

+0

Определение «безопасной ». Вам придется иметь дело с ошибками обработки/отчетности, поскольку вы не можете просто вернуть строку числа или ошибки. –

+0

Вы знакомы с тем, как создавать временные таблицы на Sql-сервере, после чего вы можете создать XML-вставку Insert, которая может обрабатывать сразу все строки. Я делаю это в настоящее время, преобразовывая файл csv в datatable, а затем после того, как данные были загружены в данные, и проверки ошибок и т. Д. Выполнены .. тогда я написал свою собственную функцию для преобразования данных в XML, а затем один вызов сохраненного процедура Я делаю массовые вставки в одну таблицу через таблицы xml и temp – MethodMan

+0

Использование потоков почти никогда не является безопасным. Природа зверя. Но если это простое обновление БД, это, скорее всего, не вызовет никаких проблем. Если вы можете использовать асинхронные операции (и, возможно, с поставщиками баз данных), я бы пошел по этому маршруту, так как я думаю, что вы достигнете своей цели реагирования пользователей немного более безопасно. –

ответ

1

Вторая нить на 100% подобна основной теме, с которой вы привыкли работать. Хотелось бы, чтобы у меня был какой-то авторитетный ответ, но это такая распространенная практика, что люди больше не пишут их ...

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

Edit 1
Хорошо, если ваш поток работает на IIS, необходимо зарегистрировать его или он умрет, потому что, как только цикл запроса/réponse заканчивает это убить его ...

+0

Если он разрабатывает приложение IIS, ваши утверждения не выдерживают истину. вы не регистрируете поток с помощью IIS, ваш AppDomain может быть закрыт, прежде чем ваш поток завершит свою работу. –

+0

@ScottChamberlain да, но в этом конкретном случае он заявил в первом предложении, что действие происходит на стороне клиента ... поэтому я считаю, что, учитывая характер вопроса, я не думаю, что это дело...но отлично, плохо обновляю мой ответ – Leonardo

+1

Чтобы завершить обновление, чтобы зарегистрировать поток, самый простой способ сделать это - использовать [HostingEnvironment.QueueBackgroundWorkItem] (http://blogs.msdn.com/b/webdev/archive/ 2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-long-background-process-in-asp-net.aspx), чтобы запустить поток вверх (и даже тогда он все еще не завершен, но вы получаете CancellationToken, о котором вы можете узнать, когда у вас осталось 90 секунд, чтобы завершить свою работу или изящно отменить свою работу). –

Смежные вопросы