2013-09-04 3 views
0

Я разрабатываю приложение MultiThreaded client-server на VB.net, где несколько клиентов подключаются к одному серверу, также есть процесс на стороне сервера, который открывает файл XML и записывает некоторые данные. Но после 1 часа я получил следующую ошибку:Ошибка: многопоточное клиент-серверное приложение

"File is used by another proccess."

Есть ли какие-либо предложения с вашей стороны, по данному вопросу. Пожалуйста, проверьте мой ниже код для чтения XML

Public Function ISRecordExitsinXML(ByVal pFilepath As String, ByVal pClientIP As String, ByVal pMacAddress As String) 
    Dim xmlDoc As XmlDocument = Nothing 
    Dim xmlPupilNode As XmlNode = Nothing 
    Dim xmlAgeNode As XmlNode = Nothing 
    Try 

     Dim FileName As String = pFilepath 
     ISRecordExitsinXML = Nothing 

     xmlDoc = New XmlDocument 
     xmlDoc.Load(FileName) 
     xmlPupilNode = xmlDoc.SelectSingleNode("//RFIDReader[HostIPAddress = '" & pClientIP.Trim & "' and MacAddress = '" & pMacAddress & "' and Status=1] ") 

     If Not xmlPupilNode Is Nothing Then 
      xmlAgeNode = xmlPupilNode.SelectSingleNode("RegDateTime") 
      If Not xmlAgeNode Is Nothing Then 
       xmlAgeNode.InnerText = DateTime.Now.ToString() 
       xmlDoc.Save(FileName) 
       ISRecordExitsinXML = True 
      End If 
     Else 
      ISRecordExitsinXML = False 
     End If 
     xmlDoc = Nothing 
     xmlPupilNode = Nothing 
     xmlAgeNode = Nothing 
    Catch ex As Exception 
     xmlDoc = Nothing 
     xmlPupilNode = Nothing 
     xmlAgeNode = Nothing 
     ISRecordExitsinXML = False 
     ErrorLog.WriteToErrorLog(ex.Message.ToString(), "HSRV-A9", "ErrorLog.Log") 
    Finally 
     xmlDoc = Nothing 
     xmlPupilNode = Nothing 
     xmlAgeNode = Nothing 
    End Try 
    Return ISRecordExitsinXML 
End Function 

Заранее спасибо

+0

Я хотел бы посмотреть на безопасность потока и сделать определенные области вашего приложения «потокобезопасного» HTTP: // msdn.microsoft.com/en-us/magazine/cc163929.aspx http://msdn.microsoft.com/en-us/library/f857xew0(v=vs.71).aspx –

ответ

1

Вашей проблемы (как я уверен, что вы знаете!), Что, когда файл открыт одним процесса, оно не может быть открытый другим. Есть ли возможность использовать альтернативный носитель для приема данных, таких как база данных? Затем вы можете экспортировать данные из базы данных в XML-файл одним ударом, избегая конфликта вообще.

+0

Спасибо за ответ, но у меня есть для использования только XML-файла. – John

+0

ОК, нет проблем. Возможно ли реализовать функцию ожидания - если файл используется, то пауза на секунду или два, чтобы позволить времени для записи и закрытия и повторить попытку? – Andy

0

вы не можете закрывать файл после записи процесс закончился, поэтому он будет недоступен другим потокам

+0

Спасибо за повтор, у меня есть 2 клиентских клиента Windows, которые работают на двух разных настольных компьютерах и серверах на WAN, которые также имеют службу Windows, поэтому каждые 30 секунд интервал моих клиентских сервисов подключается к Серверу и обновляет XML-файл до 1 часа его работа прекрасна, но после этого я получаю выше Ошибка. – John

Смежные вопросы