Seltsamer Output

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von 00yoshi.

    Seltsamer Output

    Hey,

    ich hab zum Spaß mal was testen wollen und da ist dann der Code entstanden:

    VB.NET-Quellcode

    1. Dim index As Integer = 0
    2. For i As Integer = 0 To 10
    3. index += 1
    4. Call New Thread(Sub()
    5. Console.WriteLine(String.Format("Aufruf {0}", index.ToString))
    6. End Sub) With {.Priority = ThreadPriority.Lowest}.Start()
    7. Next


    Dann hab ich mir mal den Output angeschaut, der mir sofort unklar war:

    Output 1:

    Spoiler anzeigen

    Quellcode

    1. Aufruf 5
    2. Aufruf 5
    3. Aufruf 5
    4. Aufruf 5
    5. Aufruf 7
    6. Aufruf 9
    7. Aufruf 9
    8. Aufruf 10
    9. Aufruf 10
    10. Aufruf 10
    11. Aufruf 11


    Dann hab ich den Button nocheinmal gestartet und ich war schon wieder verwundert:

    Spoiler anzeigen

    Quellcode

    1. Aufruf 2
    2. Aufruf 4
    3. Aufruf 4
    4. Aufruf 6
    5. Aufruf 6
    6. Aufruf 6
    7. Aufruf 8
    8. Aufruf 11
    9. Aufruf 11
    10. Aufruf 11
    11. Aufruf 11


    schon wieder ein Random-Output.

    Ich würde mich freuen, wenn mir das einer näher erläutern könnte.

    Mfg
    Du erzeugst in der Schleife einen (11) Thread(s). Diesen Thread startest du (11x).
    Soweit die Dinge, die du kontrollieren kannst. Wann dieser Thread letztendlich ausgeführt wird, liegt nicht in deinem Ermessen.
    Nicht seltsam, sondern ... halt 'n Thread.

    der_Kurt schrieb:

    Nicht seltsam, sondern ... halt 'n Thread.

    Seltsam findet er wohl (auch), dass Werte mehrfach bzw gar nicht vorkommen.

    Abhilfe:
    for i = 1 to 10
    dim wert as integer = i
    MachwasThreadiges(wert)
    next

    So gibts zwar ebenfalls keine festgelegte Reihenfolge, aber dafür kommt jeder Wert GENAU EINMAL im Output vor. LINQ etc warnt übrigens, wenn man eine Variable in Multithreading Szenarien anspricht, die AUSSERHALB des Codeblocks gültig ist!
    Mach einfach um die ganze schleife nen Thread rum und nicht immer einen neuen Thread pro Schleife, da fehleranfällig --> siehst du ja und b performance fresser ach ja und c in diesem beispiel ist es sinnlos.
    Aber immerhin kennst du nen Thread und bist nicht so beschränkt wie der anderen hier --> timer, timer und nochmal timer von dem her doppel :thumbup:


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.