2013-08-21 5 views
0

Написание части приложения, которое должно очищать старые файлы, но некоторые из них довольно большие, поэтому я запускаю BackgroundWorkers, чтобы выполнить основную часть работы. Мой вопрос, если я звоню на file.Delete вызов на объект FileInfo на BackgroundWorker и выхода из приложения:BackgroundWorker and Deleting large files

  • Что будет в этот файл, он собирается торчать в нерабочем состоянии?
  • Будет ли приложение зависеть, или BGWorker останется в живых?
  • Неверный ли файл?
  • Есть ли BackgroundWorker правильный класс для использования в этом случае?
+0

Я думаю, что рабочий рабочий является правильным выбором для такого рода операций. Я, вероятно, не могу ответить на все ваши вопросы, но вот некоторые из ответов: ни одно приложение не будет висеть в качестве фонового рабочего. Как только фоновый рабочий начнет обрабатывать файл, я думаю, что он может перейти в недопустимое состояние. Не могли бы вы использовать параллельную библиотеку задач, это в основном делает то же самое, но гораздо проще. – qamar

+0

Если вы опасаетесь, что ваше приложение неожиданно завершится, и это действительно большие файлы, вы можете создать службу Windows, которая предоставляет очередь удаления. Фактически это будет ваша обложка backgroundWorker. Если вы хотите удалить файл, почему вы беспокоитесь, если он будет недействительным? Или вы просто хотите убедиться, что он действительно удален? – mrtig

+0

Просто хочу убедиться, что он действительно ушел в основном. Я не очень беспокоюсь об этом неожиданно, но пользователь приложения может отказаться от приложения, не зная, что файлы удаляются. Я хотел бы сделать его максимально прозрачным. – Craig

ответ

0

Хорошо, чтобы обойти эту проблему, я переключился на использование объекта Thread. Это создает поток переднего плана, и приложение не должно выходить, пока все потоки переднего плана не будут завершены.

Извините за хлопот.

0

Если вы хотите, чтобы ваша прикладная нить подождала, пока файл будет удален, вы можете использовать BackgroundWorker в сочетании с AutoResetEvent. Это объясняется в How to wait for a BackgroundWorker to cancel? (Пожалуйста, обратите внимание, что этот ответ содержит дополнительную информацию об отмене тоже)

Таким образом, у вас еще есть преимущества наличия события, предоставляемые BackgroundWorker, такие как ProgressChanged и RunWorkerCompleted.

Конечно, создание передних нитей - это еще одна работа, которая работает, потому что они блокируют основной поток, пока не выйдут. Но это не может быть самым элегантным решением.