2010-12-03 21 views

答えて

5

はい、できます。
これはClosureと呼ばれます。それは非常に強力な機能です。

スレッドの安全性、またはスレッドの安全性に違いはありません。
インスタンスをクロージャを通して取得する場合でも、StartNewパラメータで取得する場合でも、それは同じオブジェクトです。 (それはstructであり、明らかに悪いことではない)

+0

したがって、タスクが実行されるまでdataRequest変数がガベージコレクションされないようにしますか?私はそれに関する情報を見つけることができませんでした。 – Andrey

+1

@Andrey:はい。オブジェクトを見ることができれば、GCされていない可能性があります。あなたはそれについて心配する必要はありません。 (弱参照や安全でないコード/アンマネージコードを使用する場合を除いて) – SLaks

+0

ありがとう!私はちょうどC#のクロージャがjavascriptと違って動作するかどうかはわかりませんでした。 javascriptでは、コールバックはあなたがそれを使用している瞬間に変数の現在の状態を使用します。そのため、「ダブルクロージャー」を行う必要があります。私はC#がよりスマートになってうれしいです:) – Andrey

1

あなたの質問に答えても、スレッドセーフではないかもしれません。私はThreadLocalを利用する方法を学びます。

デリゲートメソッド内では、dataRequestを分離する必要があります。

ThreadLocal<DataRequest> tls = new ThreadLocal<DataRequest>(); 

Task.Factory.StartNew(request => { 
    tls.Value = (DataRequest)stateObject; 

    /// 
}, dataRequest); 

/*私は同じ問題を抱えていたPro .NET Parallel Programming in C# */

+0

これはまったく役に立ちません。それはまだ同じインスタンスです。 – SLaks

+0

これは私の質問に答えません。私はスレッドの安全性について心配していませんでした - 私が渡したこのオブジェクトは誰にもアクセスされません。私はそのタスク実行スレッド内のオブジェクトのアクセシビリティについて懸念していました。 – Andrey

+0

申し訳ありませんが、私はあなたの点を逃しました。 - 私の答えを削除する可能性が、私の間違いを示すためにそれを保つ:-)乾杯。 – Jirapong

2

からそれを得ます。ラムダ式の代わりにアクションを使用します。

private void StartUpdate(DataRequest dataRequest) 
{ 
    Action<DataRequest> pobjAction = new Action<DataRequest>(DoSomething); 
    Task.Factory.StartNew(pobjAccion, dataRequest); 
} 


private void DoSomething(DataRequest dataRequest) 
{ 
    Trace.WriteLine(dataRequest.ToString()); 
} 
+1

残念ながらそれは動作しません。 TPLは、アクション<>でジェネリックを持っていませんが、アクションでのみ動作しています。 – Timotei

+0

解決策は、Object型のDoSomethingにパラメータを作成するか、StartNew引数として内部でパラメータを持つFuncを使用することです。 –

関連する問題