Benutzer mit den meisten Antworten
wieso sind die vb.net codebeispiele im MSDN verhunzt?

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
- Bearbeitet Thomas Keller60 Dienstag, 13. November 2012 13:45
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
- Als Antwort markiert Thomas Keller60 Dienstag, 13. November 2012 14:19
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
- Als Antwort markiert Thomas Keller60 Dienstag, 13. November 2012 14:19
-
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 ;-)
-
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-b4b76364Gruß Elmar
-
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
-
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
-
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 -
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/
-
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