はこの考えてみましょう方法?私の懸念は、そのメソッドは別のスレッドで実行され、dataRequestがそこで使用されるときに状態を保持するかどうかはわかりません。Task.Factory.StartNew「アクション」の引数と、より高いレベルのローカル変数
2
A
答えて
5
はい、できます。
これはClosureと呼ばれます。それは非常に強力な機能です。
スレッドの安全性、またはスレッドの安全性に違いはありません。
インスタンスをクロージャを通して取得する場合でも、StartNew
パラメータで取得する場合でも、それは同じオブジェクトです。 (それはstruct
であり、明らかに悪いことではない)
1
あなたの質問に答えても、スレッドセーフではないかもしれません。私はThreadLocalを利用する方法を学びます。
デリゲートメソッド内では、dataRequestを分離する必要があります。
ThreadLocal<DataRequest> tls = new ThreadLocal<DataRequest>();
Task.Factory.StartNew(request => {
tls.Value = (DataRequest)stateObject;
///
}, dataRequest);
/*私は同じ問題を抱えていたPro .NET Parallel Programming in C# */
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は、アクション<>でジェネリックを持っていませんが、アクション
+0
解決策は、Object型のDoSomethingにパラメータを作成するか、StartNew引数として内部でパラメータを持つFuncを使用することです。 –
関連する問題
- 1. グローバル変数はC言語のローカル変数より高速ですか?
- 2. アセンブリ内のローカル変数:グローバル変数よりも高速ですか?
- 3. 関数の引数をローカル変数として定義する
- 4. ローカル変数とグローバル変数の違い
- 5. 非typename引数としてのローカル変数
- 6. 引数を新しいスレッドに渡すときのローカル変数参照とGC
- 7. MVC3のアクション引数としてのヘッダ
- 8. Objective-Cのローカル変数とメンバ変数
- 9. javascriptのローカル変数とグローバル変数
- 10. ループ内のローカル変数とグローバル変数
- 11. javascriptのローカル変数とグローバル変数
- 12. C++のグローバル変数とローカル変数
- 13. アクションの複数のパラメータ/引数 - Swift
- 14. より高いまたは低いレベル?
- 15. スカラーラムダ関数とローカル変数
- 16. voidの関数とスコープのローカル変数
- 17. bashのローカル変数:ローカルとサブシェル
- 18. ルビのローカル変数とインスタンス変数の違い
- 19. ハスケルループとローカル変数
- 20. タグリストとローカル変数
- 21. ポインタとローカル変数
- 22. パーシャルとローカル変数
- 23. 私は、次のような何かをしたい型以外のテンプレート引数としてローカル変数
- 24. Rubyバインディング - ローカル変数と定数のスコープ
- 25. ローカル変数にローカル変数C#
- 26. Ocaml - グローバル変数とローカル変数
- 27. JavaScriptの引数とテンポラリ変数関数
- 28. C - 可変数の引数とコマンドライン引数を持つ関数
- 29. 引用符のない変数、異なる応答のライブとローカル
- 30. Xuggler用のより高いレベルのAPIはありますか?
したがって、タスクが実行されるまでdataRequest変数がガベージコレクションされないようにしますか?私はそれに関する情報を見つけることができませんでした。 – Andrey
@Andrey:はい。オブジェクトを見ることができれば、GCされていない可能性があります。あなたはそれについて心配する必要はありません。 (弱参照や安全でないコード/アンマネージコードを使用する場合を除いて) – SLaks
ありがとう!私はちょうどC#のクロージャがjavascriptと違って動作するかどうかはわかりませんでした。 javascriptでは、コールバックはあなたがそれを使用している瞬間に変数の現在の状態を使用します。そのため、「ダブルクロージャー」を行う必要があります。私はC#がよりスマートになってうれしいです:) – Andrey