J'ai écrit le code suivant pour effectuer une publication HTTP simultanée et archivage de fichiers:Est-ce que ce code d'enfilage fait ce que je pense qu'il est?
Dim t1 As New Threading.Thread(New Threading.ThreadStart(AddressOf ProcessNTSMessageQueue))
Dim t2 As New Threading.Thread(New Threading.ThreadStart(AddressOf ProcessNTSMessageQueue))
Dim t3 As New Threading.Thread(New Threading.ThreadStart(AddressOf ProcessSuccessfulNTSMessageQueue))
t1.Start()
t2.Start()
t3.Start()
t1.Join()
t2.Join()
t3.Join()
J'ai deux fils (1 & 2) la lecture d'une file d'attente de messages XML et l'affichage des messages via HTTP à un serveur Web . Une fois qu'un message est publié, il est retiré de cette file d'attente ajoutée à une deuxième file d'attente. Thread 3 lit cette file d'attente et écrit simplement le code XML dans un fichier.
Je m'attendrais à voir les fichiers XML apparaître progressivement comme des threads 1 & 2 traiter la file d'attente de messages (parfois la file d'attente de messages peut prendre environ 40 minutes à traiter). Ce que je vois réellement, c'est qu'aucun fichier XML n'apparaît. J'ai mal compris le code?
* Modifier. Voici le code pour les quatre méthodes filetées pertinentes:
Private Sub ProcessNTSMessageQueue()
While True
Dim msg As String = Nothing
SyncLock _MessageQueue
If _MessageQueue.Count > 0 Then
msg = _MessageQueue.Dequeue()
Else
Exit Sub
End If
End SyncLock
'Post the message
'it's important to do this outside lock()
If msg <> Nothing Then
Me.PostXMLToNTS(msg)
End If
End While
End Sub
Private Sub ProcessSuccessfulNTSMessageQueue()
While True
Dim msg As String = Nothing
SyncLock _SentMessageQueue
If _SentMessageQueue.Count > 0 Then
msg = _SentMessageQueue.Dequeue()
Else
Exit Sub
End If
End SyncLock
'Post the message
'it's important to do this outside lock()
If msg <> Nothing Then
Me.ArchiveXMLAsFile(Guid.NewGuid.ToString, msg)
_SuccessfulMessageCount += 1
End If
End While
End Sub
Private Function PostXMLToNTS(ByVal XMLString As String) As Boolean
Try
Dim result As Net.HttpStatusCode = NTSPoster.PostXml(XMLString, _Settings.NTSPostURLCurrent, _Settings.NTSPostUsernameCurrent, _Settings.NTSPostPasswordCurrent)
Select Case result
Case Net.HttpStatusCode.Accepted, Net.HttpStatusCode.OK 'Good
If _SentMessageQueue Is Nothing Then
_SentMessageQueue = New Queue(Of String)
End If
_SentMessageQueue.Enqueue(XMLString)
Return True
Case Else 'Probably bad
If _FailedMessageQueue Is Nothing Then
_FailedMessageQueue = New Queue(Of String)
End If
_FailedMessageQueue.Enqueue(XMLString)
Return False
End Select
Catch ex As Exception
Throw
End Try
End Function
Private Sub ArchiveXMLAsFile(ByVal name As String, ByVal XML As String)
Try
'Create directory in archive location based on todays date
Dim dir As New DirectoryInfo(Me.TodaysXMLArchiveLocation)
'If the directory does not already exist then create it
If Not dir.Exists Then
dir.Create()
End If
Dim FileName As String = String.Format("{0}.xml", name)
Using sw As StreamWriter = New StreamWriter(Path.Combine(dir.FullName, FileName))
sw.Write(XML)
sw.Close()
End Using
Catch ex As Exception
Throw
End Try
End Sub
Vous devrez afficher le code des fonctions 'ProcessNTSMessageQueue' et' ProcessSuccessfulNTSMessageQueue'. –
Merci à tous pour l'aide, c'est ma première incursion dans le filetage et je ne suis pas vraiment sûr de ce que je fais à ce stade! – Simon