Guten Abend,
ich habe ein kleines Problem damit, eine brauchbare Warteschlange für das Abarbeiten von Methoden zu erstellen, die threadsicher funktionieren sollte.
Ausgangslage ist der Bug, dass Newtonsoft.Json unter Mono bei gleichzeitigem Aufruf aus mehreren Threads unter (für mich noch nicht ganz klaren) Umständen das ganze Programm zum Abstürzen bringt.
Mein bisheriger Versuch ist wie im Code oben. Jedoch führt dies dazu, dass oft die aktuell abzuarbeitende ID um bis zu 100 höher ist als die aktuell "neue" ID - und dass sich das ganze teilweise komplett aufhängt. Ich muss dazu sagen, dass ich bis zu 400-600 Vorgänge pro Sekunde habe.
Hat dort jemand möglicherweise einen Vorschlag, wie das ganze besser lösbar wäre?
Nico
ich habe ein kleines Problem damit, eine brauchbare Warteschlange für das Abarbeiten von Methoden zu erstellen, die threadsicher funktionieren sollte.
Ausgangslage ist der Bug, dass Newtonsoft.Json unter Mono bei gleichzeitigem Aufruf aus mehreren Threads unter (für mich noch nicht ganz klaren) Umständen das ganze Programm zum Abstürzen bringt.
VB.NET-Quellcode
-
- Public Class JSONManagement
- Shared initialized As Boolean = False
- Shared jss As JsonSerializerSettings
- Public Shared actID As ULong = 0
- Public Shared nextID As ULong = 0
- Public Shared Function toJSON(Of T)(ByVal obj As T) As String
- init()
- wait()
- Dim s As String = ""
- Try
- s = JsonConvert.SerializeObject(obj, jss)
- 'Console.WriteLine("JSONSer: " & s)
- Catch ex As Exception
- Throw ex
- End Try
- actID += CULng(1)
- Return s
- End Function
- Public Shared Function fromJSON(Of T)(ByVal obj As Object) As T
- init()
- wait()
- Dim ret As T = Nothing
- Try
- 'Console.WriteLine("JSONDeS: " & obj.ToString)
- ret = JsonConvert.DeserializeObject(Of T)(obj.ToString, jss)
- Catch ex As Exception
- Throw ex
- End Try
- actID += CULng(1)
- Return ret
- End Function
- Private Shared Sub wait()
- Dim myID As ULong = nextID
- nextID += CULng(1)
- Dim count As Integer = 0
- Do Until myID <= actID Or count > 100
- System.Threading.Thread.Sleep(0)
- count += 1
- Loop
- End Sub
- Private Shared Sub init()
- If initialized = True Then
- Exit Sub
- End If
- jss = New JsonSerializerSettings()
- jss.ContractResolver = New PrivateContractResolver
- jss.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
- initialized = True
- End Sub
- End Class
Mein bisheriger Versuch ist wie im Code oben. Jedoch führt dies dazu, dass oft die aktuell abzuarbeitende ID um bis zu 100 höher ist als die aktuell "neue" ID - und dass sich das ganze teilweise komplett aufhängt. Ich muss dazu sagen, dass ich bis zu 400-600 Vorgänge pro Sekunde habe.
Hat dort jemand möglicherweise einen Vorschlag, wie das ganze besser lösbar wäre?
Nico