Я работаю над приложением, которое должно принимать конкретные решения на основе файлов, которые помещаются в папку, отслеживаемую средством просмотра файлов.
Часть этого процесса принятия решений включает переименование файлов перед их перемещениемв другую папку для обработки.
Поскольку я работаю с файлами разных размеров, я создал объект, который проверяет файл в отдельном потоке, чтобы убедиться, что он «доступен» и когда он естьзапускает событие.
Когда я запускаю код переименования из этого доступного события, оно работает.
public void RenameFile_Test()
{
string psFilePath = @"C:\File1.xlsx";
tgt_File target = new FileObject(psFilePath);
target.FileAvailable += new FileEventHandler(OnFileAvailable);
target.FileUnAvailable += new FileEventHandler(OnFileUnavailable);
}
private void OnFileAvailable(object source, FileEventArgs e)
{
((FileObject)source).RenameFile(@"C:\File2.xlsx");
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда расширения отличаются от источникафайл и переименование в файл Я делаю вызов фабрике преобразования, которая возвращает объект фабрики в зависимости от типа преобразования, а затем соответствующим образом преобразует файл перед выполнением переименования.Когда я запускаю этот конкретный кусок кода в модульном тесте, он работает, возвращается фабричный объект, и преобразование происходит правильно.
Но когда я запускаю его в процессе, я получаю ...
moExcelApp = new Application();
часть преобразования .xls или .xlsx в .csv, и я получаю ошибку "Поток был прерван".
Есть мысли?
Обновление:
Существует немного больше информации и немного карты того, как приложение работает в настоящее время.
- Клиентское приложение, выполняющее FSW
- On FileСозданное событие Создает FileObject, передавая путь к файлу.
При создании файл проверяется: если файл существует, то true,
Thread toAvailableCheck = new Thread(new ThreadStart(AvailableCheck));
toAvailableCheck.Start();
Метод AvailableCheck неоднократно пытается открыть потоковый ридер для файла, пока не будет создан ридер или не истечет количество попыток.Если читатель открыт, он запускает событие FileAvailable, если нет, то запускает событие FileUnAvailable, возвращая себя обратно в этом событии.
Клиентское приложение подключено для перехвата этих событий изнутри.событие Oncreated в FSW.
- , затем метод OnFileAvailable вызывает функцию переименования, которая содержит вызов взаимодействия Excel.
- Если файл переименовывается (не преобразуется, расширения остаютсято же самое) он перемещает, чтобы изменить имя со старого имени файла на новое, и, если это преобразование, он запускает объект фабрики преобразования, который возвращает правильный тип преобразования на основе расширений исходного файла и имени файла назначения.,
- Если это простое переименование, оно работает без проблем.Если это преобразование (то есть объект XLS в CSV, возвращаемый как часть фабрики), то самое первое, что он делает, - это создает новый объект приложения.Вот где приложение бомбит.
Когда я тестирую процесс фабрики и преобразования / переименования вне потока и в своем модульном тесте, процесс работает без проблем.
Обновление:
Я протестировал Excel Interop внутри потока, выполнив это:
[TestMethod()]
public void ExcelInteropTest()
{
Thread toExcelInteropThreadTest = new Thread(new ThreadStart(Instantiate_App));
toExcelInteropThreadTest.Start();
}
private void Instantiate_App()
{
Application moExcelApp = new Application();
moExcelApp.Quit();
}
И на линии, где создается приложение, я получил 'A firstСлучайное исключение типа «System.Threading.ThreadAbortException» ошибка.
Итак, я добавил;
toExcelInteropThreadTest.SetApartmentState(ApartmentState.MTA);
после создания экземпляра потока и перед вызовом запуска потока и все еще получил ту же ошибку.Я понимаю, что мне придется пересмотреть дизайн.