2009-03-17 9 views

Antwort

12

Nicht 100% klar, was Sie fragen.

Fragen Sie, ob lambdas natürlich auf einem anderen Thread laufen?

Wenn dies der Fall ist, sind sie nur eine weitere Instanz von System.Delegate und werden im Hauptthread ausgeführt, es sei denn, Sie werden ausdrücklich dazu aufgefordert.

Fragen Sie, ob sie sicher auf mehreren Threads ausgeführt werden können?

Dies ist eine Frage, die nur durch Kenntnis des Inhalts des Lambda-Ausdrucks beantwortet werden kann. Sie sind nicht von Natur aus threadsicher. Meiner Erfahrung nach sind die Threads weniger sicher als Sie es erwarten würden.

+0

Danke. Ich habe # 1 gefragt. –

+0

s/main thread/current thread/wie immer wo der Delegierte ausgeführt wird. – Richard

6

Nein, sie werden auf dem Thread ausgeführt, auf dem sie erstellt werden, es sei denn, Sie übergeben es an einen anderen Thread, genau wie bei jeder anderen Methode. Sie möchten nicht, dass sie automatisch auf einem anderen Thread laufen, vertrauen Sie mir.

+0

Pedantisch: es ist das Gewinde, in dem die Delegierten ausgeführt wird (zB auf einem Thread erstellen, übergeben als Verweis auf eine andere und die Delegierten ist dort ausgeführt). – Richard

2

Nun, ein Lambda ist nur eine anonyme Methode, es wird auf dem Thread ausgeführt, auf dem es aufgerufen wird, es sei denn, Sie stellen Code zur Ausführung in einem separaten Thread zur Verfügung.

3

In der nächsten Version von C# fügen sie LINQ (PLINQ) und Delegaten Multi-Threading-Optionen hinzu. Schauen Sie sich mehr an here. Momentan ist alles in einem einzigen Thread.

+0

Nun, es ist auf welche Threads * Sie * verwenden möchten ... nicht unbedingt nur die eine. –

+0

Auch ich bin mir ziemlich sicher, dass es eine reine Bibliothek sein wird, keine C# spezifische Sache. –

+0

ja sollte ich wahrscheinlich von der nächsten Version von .net. Entschuldigung. – Shawn

3

Wie andere bereits gesagt haben, sind Lambda-Ausdrücke nicht von Natur aus Multi-Threading, und auch die Standard-Linq-To-Objects-Erweiterungsmethoden tun nichts Besonderes, um sie in separaten Threads aufzurufen.

Wenn Sie jedoch einige linq-ähnliche Multithread-Programmierung durchführen möchten, sollten Sie die Parallel Extensions to .NET Framework überprüfen. Überprüfen Sie auch diesen Link:
http://blogs.msdn.com/pfxteam/

Leider ist dies nicht RTM bis VS2010/.Net4.0 ist out.

2

Lambda-Ausdrücke sind nur Methoden wie alle anderen. Was macht eine Methode Multithread?

  • Kein Zugriff auf externe Felder (einfache Eingabe/Ausgabe-Verfahren) - ein solches Verfahren immer
  • Zugriff auf ein synchronisiertes Feld multithreaded - betrachten Synchronisation Szenario (Monitor Klasse, Leser/Schreiber-Sperre, Interlocked Zugang, WaitHandle, etc.), minimieren Sie die Sperrkonflikte.
  • ein aufgenommenes Variable Zugriff (Verschluss) - stellen Sie sicher, dass das aufgenommene Variable als andere Threads es verwenden, so lange nicht ändert (wie die Variable zugegriffen wird: liest gerade liest und schreibt ...)

Der C# -Compiler ist intelligent genug, um zu wissen, ob statische oder Instanzmethoden für Ihre Lambdas generiert werden.

+0

Danke. Wenn Sie sagten "Was macht eine Methode Multithread?", Meinten Sie, dass diese Richtlinien es Thread-sicher oder Multi-Threading bei der Ausführung machen? –

+0

Ich meine Multithreaded ist Thread-Safe. Wenn eine Methode (oder Lambda) von verschiedenen Threads aufgerufen wird, wird sie in jedem Thread separat ausgeführt, d. H. Jeder Thread hat seinen eigenen Aufruf-Stack. –

2

Möglicherweise verwirrende (aber wahre) Antwort.In einigen häufig auftretenden Szenarien kann ein Lambda auf einer anderen Maschine ausgeführt werden, in einer vollständig anderen Laufzeitumgebung und daher in einem anderen Thread, und der Aufrufer muss nicht unbedingt auf die vollständige Ausführung der Remoteausführung warten, bevor er fortfährt.

(genauer gesagt, wenn man es auf eine Linq Um SQL-Abfrage übergeben.)

+0

Guter Punkt, auch wenn nicht die direkteste und nicht-lokale Ausführung – Pierreten

Verwandte Themen