Hidhoud1991 Ответов: 0

Как получить доступ к одному и тому же 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

его больше нигде не открывали

0 Ответов