none
Wie kann denn das gehen? ArgumentOutOfRangeException... RRS feed

  • Frage

  • Guten Abend,

    ich habe hier ein seltsames Phänomen, was ich einfach nicht "unterbinden" kann. Während If MeineListe.Count > 0 noch funktioniert, bekomme ich in der nächsten Zeile knallhart serviert "Index ist außerhalb des Bereichs", was aber nachweislich nicht stimmt.

    Ich habe mal einen Screenshot gemacht:

    rs kommt durch eine For-Each-Schleife in einer Liste. In dieser Liste, befindet sich u.a. die MessageQueue-Liste. Ich frage also explizit vorher nach, ob noch mindestens eine Nachricht in der Liste ist. Antwort ist ja. Im nächsten Moment ziehe ich diese Nachricht raus und lege diese in die Variable m ab. Und genau da knallt es dann. Der Knaller ist nur, in m ist die Nachricht drin, wie man im Screenshot sehen kann.

    Wie geht das? Und wie stelle ich das ab? Mit SyncLock z.B. nicht.

    Kennt jemand das Phänomen und hat vielleicht eine Lösung? Der Fehler kommt natürlich "irgendwann" einmal. Auch ein Versuch mit dem Try-Catch-Block schlug fehl.

    Gruß
    Andy

    Dienstag, 12. Dezember 2017 20:22

Antworten

  • Hallo Andy,

    was genau ziehst Du wo und auf welche Art "raus".

    Änderst Du das Array, welches Du für den Schleifendurchlauf verwendest? Falls ja, solltest Du das vermeiden. Und falls doch, nicht mit ForEach, sondern mit einer Zählschleife und da am besten von hinten nach vorne durchgehen und immer nur das letzte Element entfernen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AndreasMahub Mittwoch, 13. Dezember 2017 06:35
    Dienstag, 12. Dezember 2017 21:59
    Moderator

Alle Antworten

  • Hallo Andy,

    was genau ziehst Du wo und auf welche Art "raus".

    Änderst Du das Array, welches Du für den Schleifendurchlauf verwendest? Falls ja, solltest Du das vermeiden. Und falls doch, nicht mit ForEach, sondern mit einer Zählschleife und da am besten von hinten nach vorne durchgehen und immer nur das letzte Element entfernen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AndreasMahub Mittwoch, 13. Dezember 2017 06:35
    Dienstag, 12. Dezember 2017 21:59
    Moderator
  • Guten Morgen Stefan,

    ja, leider wird das Array geändert. Nachdem ich mein Post abgeschickt habe, fiel mir kurze Zeit später ein, dass es einen weiteren Thread gibt, der auf ausgehende Nachrichten prüft, diese Nachricht dann sendet und anschließend diese Nachricht aus dem Array nimmt.

    Habe es jetzt mit einer zusätzlichen Funktion lösen können:

    Public Function GetNextInboundMessage() As MessageBase
    
            Dim res As MessageBase = Nothing
    
            Try
                Dim messageList = From x In MessageQueue Where x.MessageType = MessageBase.MessageTypeEnum.Inbound
    
                If Not messageList Is Nothing Then
                    If messageList.Count > 0 Then
                        res = messageList.First
                    End If
                End If
    
            Catch ex As Exception
    
            End Try
    
            Return res
    
        End Function
    Die aufrufende Routine prüft dann ob Nothing oder nicht. Das scheint wohl zu funktionieren, jedenfalls länger als sonst (läuft jetzt eine Viertelstunde). Ich lasse es mal bis heute Abend durchlaufen, mal sehen ob es immer noch läuft wenn ich von Arbeit komme :-)

    Gruß
    Andy

    Mittwoch, 13. Dezember 2017 06:35