2016-08-23 3 views
1

Grundsätzlich, wenn ich so etwas wie diese ...Ist ein Func <T> immer das gleiche Objekt?

class Bla 
    T Run(Func<T> myFun) 
    return myFun() 

    void SomeMethod() 
    Run(() => whatever()) 

und dann myfun immer das gleiche Objekt oder ein neues Objekt jedes Mal? Oder anders formuliert ... wenn ich eine Sperre setzen würde, würde das eine parallele Ausführung verhindern?

+0

Fragen Sie, ob '() => was auch immer()' jedes Mal ein neues Delegate-Objekt erstellt? –

+0

@ LasseV.Karlsen: ja. – FrankyBoy

+1

Wenn Sie nicht wissen, wie ein Objekt erstellt wurde, können Sie * niemals * sicher sein, dass das Objekt zum Speichern des Sperrstatus geeignet ist. True für GetType(), true für * this *, double-true für ein Methodenargument, triple-true für ein Delegate-Objekt. Immer, * immer * erstelle dein eigenes Objekt mit 'new object()'. –

Antwort

2

Dies:

() => whatever() 

erstellt ein neues Objekt delegieren jedes Mal.

Das bedeutet, dass, wenn zwei Threads rufen beide SomeMethod zugleich, dann wird jeder von ihnen ihre eigenen Delegierten konstruieren und eine Sperre innerhalb Run setzen nicht nur ein Thread sicherstellen können die Delegierten ihre Run weitergegeben laufen.

You can test this in this .NET Fiddle.

+0

Verdammt, dachte so viel, aber ich hoffte, dass ich falsch lag. Auch ordentliche Stelle dort, wusste das nicht. – FrankyBoy

Verwandte Themen