2009-03-17 6 views

risposta

12

Non 100% chiaro su quello che stai chiedendo.

Stai chiedendo se i lambda sono naturalmente eseguiti su un filo diverso?

In caso affermativo no, sono solo un'altra istanza di System.Delegate ed eseguiti sul thread principale a meno che non sia specificamente richiesto di fare altrimenti.

Stai chiedendo se sono sicuri per l'esecuzione su più thread?

Questa è una domanda alla quale è possibile rispondere solo conoscendo il contenuto dell'espressione lambda. Non sono intrinsecamente thread-safe. Nella mia esperienza, è molto meno probabile essere thread-safe di quanto ci si aspetterebbe.

+0

Grazie. Stavo chiedendo # 1. –

+0

s/thread principale/thread corrente/come ovunque viene eseguito il delegato. – Richard

6

No, vengono eseguiti sul thread su cui sono stati creati, a meno che non lo si passi ad un altro thread, proprio come qualsiasi altro metodo. Non vorresti che funzionassero su un thread diverso automaticamente, fidati di me.

+0

pedantically: È il filo in cui viene eseguito il delegato (es creare su un filo, passare come riferimento all'altro e il delegato è giustiziato lì). – Richard

2

Beh, un lambda è solo un metodo anonimo, viene eseguito su qualunque thread venga chiamato a meno che non si fornisca il codice da eseguire su un thread separato.

3

Nella prossima versione di C#, aggiungono opzioni di multi-threading a LINQ (chiamato PLINQ) e delegati. Scopri ulteriori informazioni here. Attualmente, è tutto su un singolo thread.

+0

Beh, è ​​su qualunque argomento * tu * scegli di usare ... non necessariamente solo quello. –

+0

Inoltre sono abbastanza sicuro che sarà puramente una libreria, non una cosa specifica per C#. –

+0

sì, probabilmente dovrei dire della prossima versione di .net. scuse. – Shawn

3

Come altri hanno già detto, le espressioni lambda non sono intrinsecamente multi-thread, né i metodi di estensione standard di linq-to-object fanno qualcosa di speciale per chiamarli in thread separati.

Tuttavia, se si desidera eseguire una programmazione multi-threading simile a linq, è necessario controllare lo Parallel Extensions to .NET Framework. Verificate anche questo link:
http://blogs.msdn.com/pfxteam/

Purtroppo, questo non sarà RTM fino VS2010/.Net4.0 è fuori.

2

Le espressioni lambda sono solo metodi come gli altri. Cosa rende multithread un metodo?

  • Nessun accesso ai campi esterni (semplice metodo di input/output) - un tale metodo è sempre multithreaded
  • Accesso a un campo sincronizzato - prendere in considerazione lo scenario di sincronizzazione (Monitor classe, blocco di lettura/scrittura, Interlocked accesso, WaitHandle, ecc.), ridurre al minimo le controversie sulla serratura.
  • Accesso a una variabile catturato (chiusura) - fare in modo che la variabile catturato non cambia finché altri thread lo usano (come la variabile è accessibile: basta legge, legge e scrive ...)

Il compilatore C# è abbastanza intelligente da sapere se sono stati generati metodi statici o di istanza per i lambda.

+0

Grazie. Quando hai detto "Cosa rende multithread un metodo?", Intendevi dire che queste linee guida lo rendono thread-thread o multi-thread quando viene eseguito? –

+0

Voglio dire che il multithreading è thread-safe. Se un metodo (o lambda) viene chiamato da diversi thread, viene eseguito separatamente in ciascun thread, ad esempio ogni thread ha il proprio stack di chiamate. –

2

Risposta potenzialmente confusa (ma vera).In alcuni scenari comunemente incontrati, un lambda può essere eseguito su un'altra macchina, in un tipo di ambiente di runtime completamente diverso, e quindi su un altro thread, e il chiamante non deve necessariamente attendere il completamento dell'esecuzione remota prima di continuare.

(In particolare, se si passa a una query LINQ to SQL.)

+0

Un buon punto, anche se non l'esecuzione più diretta e non locale – Pierreten