基本的に、私はこのような何か...Func <T>は常に同じオブジェクトですか?
class Bla
T Run(Func<T> myFun)
return myFun()
void SomeMethod()
Run(() => whatever())
、その後MYFUN常に同じオブジェクト、または新しいオブジェクトごとに行いますか?あるいは少し違う方法で策定されています...もし私がそれにロックをかけると、並列実行を妨げるでしょうか?
基本的に、私はこのような何か...Func <T>は常に同じオブジェクトですか?
class Bla
T Run(Func<T> myFun)
return myFun()
void SomeMethod()
Run(() => whatever())
、その後MYFUN常に同じオブジェクト、または新しいオブジェクトごとに行いますか?あるいは少し違う方法で策定されています...もし私がそれにロックをかけると、並列実行を妨げるでしょうか?
この:
() => whatever()
は、新しいデリゲートオブジェクトごとに作成されます。二つのスレッドが同時にSomeMethod
を呼び出す場合は、それらのそれぞれが独自のデリゲートを構築し、そのRun
に渡されたデリゲートを実行できるだけのスレッドを保証しませんRun
の内側にロックをかけることを意味します
。
くそっと思ったけど、私が間違っていると思っていた。また、そこにきちんとしたサイトは、そのことを知らなかった。 – FrankyBoy
'()=> whatever()'が毎回新しいデリゲートオブジェクトを作成するかどうか尋ねていますか? –
@ LasseV.Karlsen:はい。 – FrankyBoy
オブジェクトがどのように作成されたのかわからない場合は、そのオブジェクトがロック状態を格納するのに適していることを決して*決して*することはできません。 GetType()の場合はTrue、* this *の場合はtrue、メソッドの引数の場合はdouble、デリゲートオブジェクトの場合はtriple-trueです。常に、*常に* 'new object()'で独自のオブジェクトを作成します。 –