なぜTaskFactory.StartNew方法は、汎用ではないでしょうか?
-
12-09-2019 - |
質問
新副作用のみのタスクを(つまり:結果を返さないタスク)を開始するidomatic方法以下のAPIを使用している.NET 4.0にTPLを使用します:
Task Task.Factory.StartNew(Action<object>, object)
しかし、なぜこのAPIの署名はこのようには見えません。
Task Task.Factory.StartNew<T>(Action<T>, T)
あるいは、このような
Task Task.Factory.StartNew<T>(T, Action<T>)
技術的な理由やその他の理由?
解決
さて、今私が正しく質問を理解していること:)
私は、これは、直接であることを意味するからだと信じていますThreadPool.QueueUserWorkItem
の交換。私はそれがやや奇妙に思えることに同意...しかし、の場合のあなたはとにかくラムダ式を使用している、それはのバージョンを使用する方が簡単でしょうし、の状態パラメータを取る(すなわちん代わりにAction
のAction<object>
)とちょうどあなたが事前に興味を持っている値をキャプチャします。 (
他のヒント
スティーブンToub(MSFT)によってポストによると、彼らは我々が状態データを渡すために閉鎖に依存しようとしていることを想定しています。署名のあいまいさに関するいくつかの言い訳もありました。 (ます。http://social.msdn。 microsoft.com/Forums/en/parallelextensions/thread/1988294c-de41-476a-a104-aa550b7409f5する)
ただし、この問題を解決するために閉鎖に頼ることは、よりよい解決策を待っている一時的なハックのように思えます。それは動作しますが、それは良い長期的な解決策ではありません。そこアクションが最も簡単な方法だろうと単純にデリゲートメソッドを指定して、多くの時間があるが、それは我々がグローバルVARSを使用するために持っているか、我々は状態パラメータの受け渡しから除外していることを意味します。
私は(MSフォーラムの投稿から)ヒューゴの提案の1が好きです。ヒューゴは、ジェネリックの曖昧さの問題を回避するための賢い方法のように思えるTaskStateタイプを導入する提案します。
Task.Factory.StartNew()署名とタスク()のようなコンストラクタにこれを適用する:
public Task<T>( Action<T> function, TaskState<T> state );
public Task<T,TResult>( Func<T,TResult> function, TaskState<T> state );
ActionStateは多くのNullableクラスのようになります - バリュー部材の周囲だけの単純なラッパー。実際には、TaskStateを使用すると、次のようになります。
var myTask = new Task( MyMethod, new TaskState( stateInfo ) );
...
public void MyMethod( StateInfo stateInfo ) { ... }
TaskState <>解決策は完璧ではないが、それは型キャストの閉鎖に頼るよりもはるかに良い解決策のように思える。