У меня есть следующие строки кода:
xslt.Load(XmlReader.Create(new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open)));
xslt.Transform(mydoc.CreateReader(),null, sw);
Это хорошо работает, если я останавливаю проект и запускаю его снова, я получаю следующую ошибку:
[Система. IO.IOException] = {"Процесс не может получить доступ к файлу 'C:\website\TransList.xslt', потому что он используется другим процессом".}
Я затем имею, имеют к goto командную строку и делают IISRESET для получения, я могу также сбросить пул приложений, это является самым легким в это время, поскольку это - просто мое dev поле.
Теперь у меня действительно есть вызов в операторе выгоды попытки, но я не могу получить доступ к объекту xslt в обработчике.
Объект xslt, кажется, не имеет завершение или не располагает метод.
Сборщик "мусора" никогда не получает выстрел в него, это кажется.
Какие-либо идеи?
Вам нужно будет закрыть свой FileStream и Reader либо явно с помощью .Close (), либо с помощью оператора using:
using (FileStream fs = new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open))
{
xslt.Load(XmlReader.Create(fs));
using (var reader = mydoc.CreateReader())
{
xslt.Transform(reader, null, sw);
}
}
Нет необходимости явно создавать FileStream и XmlReader, если вы знаете местоположение файла, вы можете просто передать его методу Load, используя эту перегрузку :
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(@"C:\website\Translist.xslt");
Если вы считаете, что вам нужно создать FileStream и XmlReader, то я согласен с уже сделанными предложениями, используйте оператор using для правильного закрытия и удаления этих объектов.
Filestream реализует IDisposable и требует, чтобы вы вызывали Dispose для освобождения внешних ресурсов, а также неявно; y вызовите close (). Вы должны заключить свой экземпляр Filestream в блок using, так как он гарантирует, что Dispose вызывается даже в случае возникновения исключения. Однако, чтобы ответить на ваш вопрос, поскольку вы не закрыли файловый поток, ваш процесс, предположительно, процесс w3wp.exe по-прежнему имеет дескриптор файлового потока, и единственный способ освободить его - это сбросить iis или перезапустить пул приложений. Для справки в будущем просто оберните файловый поток в блок using на всякий случай.