none
wieso sind die vb.net codebeispiele im MSDN verhunzt? RRS feed

  • Frage

  • Hallo,

    bei den vb.net Beispielen auf den recht hilfreichen MSDN-Seiten sind die Codebeispiele oft verhunzt. Da fehlen Leerzeichen oder Linefeeds, so dass man sich die umständlich auseinanderpopeln muss. Das liegt nicht an meinem Browser (IE9), denn der firefox macht das genauso.

    'Imports System.Threading.Tasks'Imports System.Collections.ConcurrentClass AddTakeDemo
    
        ' Demonstrates:' BlockingCollection<T>.Add()' BlockingCollection<T>.Take()' BlockingCollection<T>.CompleteAdding()PrivateSub BC_AddTakeCompleteAdding()
            Dim bc AsNew BlockingCollection(Of Integer)()
    
            ' Spin up a Task to populate the BlockingCollection Dim t1 As Task = Task.Factory.StartNew(
                Sub()
                    bc.Add(1)
                    bc.Add(2)
                    bc.Add(3)
                    bc.CompleteAdding()
                EndSub)
    
            ' Spin up a Task to consume the BlockingCollectionDim t2 As Task = Task.Factory.StartNew(
                Sub()
                    Try' Consume bcWhileTrue
                            Console.WriteLine(bc.Take())
                        EndWhileCatch generatedExceptionName As InvalidOperationException
                        ' IOE means that Take() was called on a completed collection
                        Console.WriteLine("That's All!")
                    EndTryEndSub)
    
            Task.WaitAll(t1, t2)
        EndSubSub Main()
            BC_AddTakeCompleteAdding()
    
            ' Keep the console window open in debug mode
            Console.WriteLine("Press any key to exit.")
            Console.ReadKey()
    
        EndSubEndClass

    Gibt es eine Möglichkeit, das zu ändern oder ist das ein Fehler bei MS?

    Gruß

    THomas


    Dienstag, 13. November 2012 13:44

Antworten

  • Hallo Thomas,

    das kommt bedauerlicherweise immer wieder vor, oben wohl das zur BlockingCollection.
    Nicht zuletzt, wenn mal am Layout herumgebastelt wird, wobei das eine oder andere auf der Strecke bleiben kann. Nur ist das bei dem Umfang der MSDN kaum vermeidbar und man sollte das sportlich sehen ;)

    Eine korrigierte Fassung der Beispiele zur BlockingCollection(T):

    Imports System
    Imports System.Collections.Concurrent
    Imports System.Threading
    Imports System.Threading.Tasks
    
    Class BlockingCollectionDemo
        Shared Sub Main()
            AddTakeDemo.BC_AddTakeCompleteAdding()
            TryTakeDemo.BC_TryTake()
            ToAnyDemo.BC_ToAny()
            ConsumingEnumerableDemo.BC_GetConsumingEnumerable()
            ' Keep the console window open in debug mode
            Console.WriteLine("Press any key to exit.")
            Console.ReadKey()
        End Sub
    End Class
    
    Class AddTakeDemo
    
        ' Demonstrates: 
        ' BlockingCollection<T>.Add() 
        ' BlockingCollection<T>.Take() 
        ' BlockingCollection<T>.CompleteAdding() 
        Shared Sub BC_AddTakeCompleteAdding()
            Using bc As New BlockingCollection(Of Integer)()
                ' Spin up a Task to populate the BlockingCollection  
                Using t1 As Task = Task.Factory.StartNew(
                    Sub()
                        bc.Add(1)
                        bc.Add(2)
                        bc.Add(3)
                        bc.CompleteAdding()
                    End Sub)
    
                    ' Spin up a Task to consume the BlockingCollection 
                    Using t2 As Task = Task.Factory.StartNew(
                        Sub()
                            Try
                                ' Consume the BlockingCollection 
                                While True
                                    Console.WriteLine(bc.Take())
                                End While
                            Catch generatedExceptionName As InvalidOperationException
                                ' An InvalidOperationException means that Take() was called on a completed collection
                                Console.WriteLine("That's All!")
                            End Try
                        End Sub)
    
                        Task.WaitAll(t1, t2)
                    End Using
                End Using
            End Using
        End Sub
    End Class
    
    'Imports System.Collections.Concurrent 
    'Imports System.Threading 
    'Imports System.Threading.Tasks 
    Class TryTakeDemo
        ' Demonstrates: 
        ' BlockingCollection<T>.Add() 
        ' BlockingCollection<T>.CompleteAdding() 
        ' BlockingCollection<T>.TryTake() 
        ' BlockingCollection<T>.IsCompleted 
        Shared Sub BC_TryTake()
            ' Construct and fill our BlockingCollection 
            Using bc As New BlockingCollection(Of Integer)()
                Dim NUMITEMS As Integer = 10000
                For i As Integer = 0 To NUMITEMS - 1
                    bc.Add(i)
                Next
                bc.CompleteAdding()
                Dim outerSum As Integer = 0
    
                ' Delegate for consuming the BlockingCollection and adding up all items 
                Dim action As Action =
                            Sub()
                                Dim localItem As Integer
                                Dim localSum As Integer = 0
    
                                While bc.TryTake(localItem)
                                    localSum += localItem
                                End While
                                Interlocked.Add(outerSum, localSum)
                            End Sub
    
                ' Launch three parallel actions to consume the BlockingCollection
                Parallel.Invoke(action, action, action)
    
                Console.WriteLine("Sum[0..{0}) = {1}, should be {2}", NUMITEMS, outerSum, (NUMITEMS / 2) * (NUMITEMS - 1))
                Console.WriteLine("bc.IsCompleted = {0} (should be true)", bc.IsCompleted)
            End Using
        End Sub
    End Class
    
    'Imports System.Threading.Tasks 
    'Imports System.Collections.Concurrent 
    ' Demonstrates: 
    ' Bounded BlockingCollection<T> 
    ' BlockingCollection<T>.TryAddToAny() 
    ' BlockingCollection<T>.TryTakeFromAny() 
    Class ToAnyDemo
        Shared Sub BC_ToAny()
            Dim bcs As BlockingCollection(Of Integer)() = New BlockingCollection(Of Integer)(1) {}
            bcs(0) = New BlockingCollection(Of Integer)(5)
            ' collection bounded to 5 items
            bcs(1) = New BlockingCollection(Of Integer)(5)
            ' collection bounded to 5 items 
            ' Should be able to add 10 items w/o blocking 
            Dim numFailures As Integer = 0
            For i As Integer = 0 To 9
                If BlockingCollection(Of Integer).TryAddToAny(bcs, i) = -1 Then
                    numFailures += 1
                End If
            Next
            Console.WriteLine("TryAddToAny: {0} failures (should be 0)", numFailures)
    
            ' Should be able to retrieve 10 items 
            Dim numItems As Integer = 0
            Dim item As Integer
            While BlockingCollection(Of Integer).TryTakeFromAny(bcs, item) <> -1
                numItems += 1
            End While
            Console.WriteLine("TryTakeFromAny: retrieved {0} items (should be 10)", numItems)
        End Sub
    End Class
    
    'Imports System.Threading.Tasks 
    'Imports System.Collections.Concurrent 
    ' Demonstrates: 
    ' BlockingCollection<T>.Add() 
    ' BlockingCollection<T>.CompleteAdding() 
    ' BlockingCollection<T>.GetConsumingEnumerable() 
    Class ConsumingEnumerableDemo
        Shared Sub BC_GetConsumingEnumerable()
            Using bc As New BlockingCollection(Of Integer)()
    
                ' Kick off a producer task
                Task.Factory.StartNew(
                    Sub()
                        For i As Integer = 0 To 9
                            bc.Add(i)
                            ' sleep 100 ms between adds
                            Thread.Sleep(100)
                        Next
    
                        ' Need to do this to keep foreach below from hanging
                        bc.CompleteAdding()
                    End Sub)
                ' Now consume the blocking collection with foreach. 
                ' Use bc.GetConsumingEnumerable() instead of just bc because the 
                ' former will block waiting for completion and the latter will 
                ' simply take a snapshot of the current state of the underlying collection. 
                For Each item In bc.GetConsumingEnumerable()
                    Console.WriteLine(item)
                Next
            End Using
        End Sub
    End Class
    

    Gruß Elmar

    Dienstag, 13. November 2012 14:11
    Beantworter

Alle Antworten

  • Hallo Thomas,

    das kommt bedauerlicherweise immer wieder vor, oben wohl das zur BlockingCollection.
    Nicht zuletzt, wenn mal am Layout herumgebastelt wird, wobei das eine oder andere auf der Strecke bleiben kann. Nur ist das bei dem Umfang der MSDN kaum vermeidbar und man sollte das sportlich sehen ;)

    Eine korrigierte Fassung der Beispiele zur BlockingCollection(T):

    Imports System
    Imports System.Collections.Concurrent
    Imports System.Threading
    Imports System.Threading.Tasks
    
    Class BlockingCollectionDemo
        Shared Sub Main()
            AddTakeDemo.BC_AddTakeCompleteAdding()
            TryTakeDemo.BC_TryTake()
            ToAnyDemo.BC_ToAny()
            ConsumingEnumerableDemo.BC_GetConsumingEnumerable()
            ' Keep the console window open in debug mode
            Console.WriteLine("Press any key to exit.")
            Console.ReadKey()
        End Sub
    End Class
    
    Class AddTakeDemo
    
        ' Demonstrates: 
        ' BlockingCollection<T>.Add() 
        ' BlockingCollection<T>.Take() 
        ' BlockingCollection<T>.CompleteAdding() 
        Shared Sub BC_AddTakeCompleteAdding()
            Using bc As New BlockingCollection(Of Integer)()
                ' Spin up a Task to populate the BlockingCollection  
                Using t1 As Task = Task.Factory.StartNew(
                    Sub()
                        bc.Add(1)
                        bc.Add(2)
                        bc.Add(3)
                        bc.CompleteAdding()
                    End Sub)
    
                    ' Spin up a Task to consume the BlockingCollection 
                    Using t2 As Task = Task.Factory.StartNew(
                        Sub()
                            Try
                                ' Consume the BlockingCollection 
                                While True
                                    Console.WriteLine(bc.Take())
                                End While
                            Catch generatedExceptionName As InvalidOperationException
                                ' An InvalidOperationException means that Take() was called on a completed collection
                                Console.WriteLine("That's All!")
                            End Try
                        End Sub)
    
                        Task.WaitAll(t1, t2)
                    End Using
                End Using
            End Using
        End Sub
    End Class
    
    'Imports System.Collections.Concurrent 
    'Imports System.Threading 
    'Imports System.Threading.Tasks 
    Class TryTakeDemo
        ' Demonstrates: 
        ' BlockingCollection<T>.Add() 
        ' BlockingCollection<T>.CompleteAdding() 
        ' BlockingCollection<T>.TryTake() 
        ' BlockingCollection<T>.IsCompleted 
        Shared Sub BC_TryTake()
            ' Construct and fill our BlockingCollection 
            Using bc As New BlockingCollection(Of Integer)()
                Dim NUMITEMS As Integer = 10000
                For i As Integer = 0 To NUMITEMS - 1
                    bc.Add(i)
                Next
                bc.CompleteAdding()
                Dim outerSum As Integer = 0
    
                ' Delegate for consuming the BlockingCollection and adding up all items 
                Dim action As Action =
                            Sub()
                                Dim localItem As Integer
                                Dim localSum As Integer = 0
    
                                While bc.TryTake(localItem)
                                    localSum += localItem
                                End While
                                Interlocked.Add(outerSum, localSum)
                            End Sub
    
                ' Launch three parallel actions to consume the BlockingCollection
                Parallel.Invoke(action, action, action)
    
                Console.WriteLine("Sum[0..{0}) = {1}, should be {2}", NUMITEMS, outerSum, (NUMITEMS / 2) * (NUMITEMS - 1))
                Console.WriteLine("bc.IsCompleted = {0} (should be true)", bc.IsCompleted)
            End Using
        End Sub
    End Class
    
    'Imports System.Threading.Tasks 
    'Imports System.Collections.Concurrent 
    ' Demonstrates: 
    ' Bounded BlockingCollection<T> 
    ' BlockingCollection<T>.TryAddToAny() 
    ' BlockingCollection<T>.TryTakeFromAny() 
    Class ToAnyDemo
        Shared Sub BC_ToAny()
            Dim bcs As BlockingCollection(Of Integer)() = New BlockingCollection(Of Integer)(1) {}
            bcs(0) = New BlockingCollection(Of Integer)(5)
            ' collection bounded to 5 items
            bcs(1) = New BlockingCollection(Of Integer)(5)
            ' collection bounded to 5 items 
            ' Should be able to add 10 items w/o blocking 
            Dim numFailures As Integer = 0
            For i As Integer = 0 To 9
                If BlockingCollection(Of Integer).TryAddToAny(bcs, i) = -1 Then
                    numFailures += 1
                End If
            Next
            Console.WriteLine("TryAddToAny: {0} failures (should be 0)", numFailures)
    
            ' Should be able to retrieve 10 items 
            Dim numItems As Integer = 0
            Dim item As Integer
            While BlockingCollection(Of Integer).TryTakeFromAny(bcs, item) <> -1
                numItems += 1
            End While
            Console.WriteLine("TryTakeFromAny: retrieved {0} items (should be 10)", numItems)
        End Sub
    End Class
    
    'Imports System.Threading.Tasks 
    'Imports System.Collections.Concurrent 
    ' Demonstrates: 
    ' BlockingCollection<T>.Add() 
    ' BlockingCollection<T>.CompleteAdding() 
    ' BlockingCollection<T>.GetConsumingEnumerable() 
    Class ConsumingEnumerableDemo
        Shared Sub BC_GetConsumingEnumerable()
            Using bc As New BlockingCollection(Of Integer)()
    
                ' Kick off a producer task
                Task.Factory.StartNew(
                    Sub()
                        For i As Integer = 0 To 9
                            bc.Add(i)
                            ' sleep 100 ms between adds
                            Thread.Sleep(100)
                        Next
    
                        ' Need to do this to keep foreach below from hanging
                        bc.CompleteAdding()
                    End Sub)
                ' Now consume the blocking collection with foreach. 
                ' Use bc.GetConsumingEnumerable() instead of just bc because the 
                ' former will block waiting for completion and the latter will 
                ' simply take a snapshot of the current state of the underlying collection. 
                For Each item In bc.GetConsumingEnumerable()
                    Console.WriteLine(item)
                Next
            End Using
        End Sub
    End Class
    

    Gruß Elmar

    Dienstag, 13. November 2012 14:11
    Beantworter
  • Hallo Elmar,

    ok, immerhin keine Fehleinstellung bei mir irgendwo :-) Aber schon blöde, vor allem, weil die Beispiele ja den jeweiligen Anfängern helfen sollen und die sich dadurch mit ganz anderen Problemen beschäftigen, weil der code nicht funktioniert  und die mit dem eigentlichen nichts zu tun haben... Man lernt natürlich daraus, aber der Kopf raucht noch mehr ...

    Aber wenn es eine grundsätzliche Sache ist, sollte man sich bei MS mal darum kümmern, denn das ist in der letzten Zeit nicht bei einzelnen Themen, sondern bei meinen Fragestellungen recht häufig.

    Oder ich gucke da einfach zu oft rein ;-)

    Dienstag, 13. November 2012 14:24
  • Hallo Thomas,

    naja, ich ärgere mich darüber auch immer mal wieder.

    Wobei ich die Beispiele eher selten verwende, ich bastele mir lieber meine eigenen; das Selbsttippen regt die grauen Zellen mehr an ;)

    Für die TPL findest Du vollständige Programm-Beispiele unter:
    http://code.msdn.microsoft.com/windowsdesktop/Samples-for-Parallel-b4b76364

    Gruß Elmar

    Dienstag, 13. November 2012 15:20
    Beantworter
  • Hallo Elmar,

    danke für die Beispiele. Aber das ist ja noch mehr abschreckend. Ich will im Moment ja "nur" mein Problem lösen, und Du erklärst mir, dass mein "kleines Problem" direkt ein eigenes dickes Thema ist ;-) "Paralleles Programmieren". Und wirst hast ganz bestimmt Recht haben. puuhh :-( Ich habe schon so vieles Neues gelernt. Aber nach jedem gelösten Punkt kommt ein neuer Berg, der noch höher ist...

    Liebe Grüße

    Thomas

    Dienstag, 13. November 2012 16:00
  • Hallo,

    liegt auch nicht an deinem Browser. Hab die gleichen Probleme. Auch hier im Forum, da stehen oft die gleichen Antworten untereinander oder tauchen 2 oder 3mal auf...bei großen Threads verliert man schnell die Übersicht wo derjenige gerade eigentlich im Thema ist.

    Ätzend finde ich bei den MSDN Beispielen erst wenn es um einzelene Syntaxbuchstaben geht wie ein "_" bei einer deklaration oder so was und den Fehler erst mal nicht erkennen kann. Aber ansonsten ist das Ding traumhaft ergibig. Hab durch den Code den ich gerne zunächst als Basis verwende und dann für meine Anforderungen umschreibe ( oder meist ganz neu ) echt viel gelernt.

    just my 2 cents...

    bye,

    Aparo

    Mittwoch, 14. November 2012 08:00
  • Nicht nur die Codebeispiele werden manchmal eigenartig dargestellt.
     
    Bei zeigt auch einfache Beiträge in der MSDN in letzter Zeit eine eigenartige Darstellung, z.B. hier unterhalb:
     
     
    Konkret z.B. hier:
     
     
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 14. November 2012 10:45
  • Hallo, nurmal um noch so ein paar Problemchen aufzuzeigen.

    1. XAML Code wird häufig so dargestellt:

                          <
                          StackPanel
                          >
                          <
                          Button
                          Content
                          =
                          "
                          Click Me
                          "
                          />
                          </
                          StackPanel
                          >

    http://msdn.microsoft.com/de-de/library/vstudio/ms752059.aspx

    2. Im C# Code fehlen ebenfalls öfters die Leerzeichen.

    3. Codeblöcke werden im Editor für die Foren hier manchmal auch einfach als Text oghne spezieller Formatierung dargestellt...

    4. Oder auch, das man mehr als nur eine E-Mail-Benachichtigung bekommt, wenn man einen Foren Thread abboniert hat.

    Was mich persönlich stört ist, das die "größeren" Foren wie C#, VB.NET das neuere Design haben, dagegen die Express-Foren und auch andere noch die alte Darstellung besitzen.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 14. November 2012 10:54
    Moderator
  • Hallo K.K.,

    wie schon geschrieben:
    Durch das Umstellen von Seitenformatierungen bleibt in der MSDN Library schon mal das eine oder andere auf der Strecke.

    Was die Foren angeht:

    Die Foren sind als eigener Bereich anzusehen - Fehler in der Forensoftware bitte in Forum Issues melden.

    Auch wenn man dort selten wirkliche Erfolge hat - das "Problem" mit der neuen Formatierung ist als Branding vom Marketing vorgegeben worden und Änderungswünsche werden ignoriert ;-(

    Dass der "neue" Editor keine Verbesserung darstellt, dem stimme ich, der täglich im HTML rumfummeln muss, sofort zu - und so die Lust, sich hier zu beteiligen, immer weiter abnimmt.

    Ansonsten sollten wir den Thread hier schließen und allgemeine Diskussionen im dafür vorgesehenen Forum stattfinden.

    Gruß Elmar

    Mittwoch, 14. November 2012 15:24
    Beantworter