Как получить доступ к одному и тому же XML-файлу из нескольких потоков, запущенных с разных страниц?
Как получить доступ к одному и тому же XML-файлу из нескольких потоков, запущенных с разных страниц?
У меня есть несколько потоков, запущенных каждый с другой страницы, которые хотят получить доступ к XML-файлу для настройки во время процесса потока.
Что нужно сделать, чтобы остановить эту ошибку "процесс не может получить доступ к файлу 'C:\inetpub\wwwroot\XXXXX\App_Data\XML\Setting.xml-потому что его использует другой процесс."
Что должно быть сделано?
Что я уже пробовал:
У меня есть этот метод, используемый для доступа к файлу:
Public Shared SetSettingStsXMLobj As New Object() Public Sub SetSettingStsXML() SyncLock SetSettingStsXMLobj Dim XmlFilename = System.Web.Hosting.HostingEnvironment.MapPath("App_Data\XML\Setting.xml") Dim xml As New System.Xml.XmlDocument() xml.Load(XmlFilename) Dim XXXNodeAs System.Xml.XmlNodeList = xml.SelectNodes("descendant::XXX_Status[X_status ='Active']") Dim XXXNode As New List(Of String) For Each SerNod As System.Xml.XmlNode In XXXNode ...... Next If xxID.Count > 0 Then ........ End If Dim activexxDt As DataTable =....... activexxDt.TableName = "XXXX_Status" activexxDt.WriteXml(XmlFilename, XmlWriteMode.WriteSchema, True) End SyncLock End Sub
Этот метод находится в классе, называемом :
Dim XXXXObj As New XXClass XXXXObj.SetSettingStsXML()
F-ES Sitecore
Я бы, вероятно, создал" общий " класс, который действует как оболочка для вашего xml-файла. Дать общий класс общий конструктор и в том, что конструктор читать XML в отдельный общая переменная объект XmlDocument. Затем класс будет иметь такие методы, как" GetNode", в которые могут быть переданы определенные параметры, и эти методы будут запрашивать xmldocument и возвращать результаты.
Использование такой реализации гарантирует, что xml считывается только один раз в xmldocument и хранится там, А вызывающие классы получают доступ к данным через методы.
Чтобы предвосхитить ваш следующий вопрос, нет, я не буду писать его для вас, на самом деле я этого не делаю vb.net.
Hidhoud1991
Я сделал, как показано ниже, но та же ошибка: процесс не может получить доступ к файлу 'C:\inetpub\wwwroot\XXXXX\App_Data\XML\Setting.xml-потому что он используется другим процессом.
Публичный Класс XMlFileLock
Private Shared xmlfilename As String
Частная общая XML в качестве новой системы.В формате XML.Объект XmlDocument()
Общий Суб Новый()
xmlfilename = система.Веб.Хостинг.Принимающая среда.MapPath("App_Data\XML\Setting.xml")
xml. Load(xmlfilename)
Конец Подводной Лодки
Public Shared Sub SetSettingStsXML()
Дим Системе XXXNodeAs.В формате XML.XmlNodeList = формат XML.Метод selectnodes("потомок::XXX_Status[X_status ='активный']")
Dim XXXNode Как Новый Список (Строки)
Для Каждого SerNod Как System. Xml.XmlNode В XXXNode
......
Следующий
Если xxID.Тогда считайте > 0
........
Конец, Если
Dim activexxDt As DataTable =.......
activexxDt.Имятаблицы = "XXXX_Status"
activexxDt.WriteXml(XmlFilename, XmlWriteMode.WriteSchema, Правда)
Конец Подводной Лодки
Конец Класса
Вызывается: XMlFileLock.SetSettingStsXML() из каждого запущенного потока
F-ES Sitecore
МММ, вы уверены, что он открыт где-то еще, кроме вашего .net-кода?
Hidhoud1991
его больше нигде не открывали