2012-10-29 17 views
11

どのように値を返し、パラメータを取るタスクを実行できますか?オーバーロードされたメソッドTask.Run<TResult>(Func<TResult>)があることがわかりますが、そこにどのようにパラメータを渡すことができますか?Task.RunとFunc <>

答えて

27

Func<TResult>はパラメータをとりません。通常は、ラムダ式を使用してパラメータをキャプチャします。たとえば:

public void DoSomething(string text) 
{ 
    Task<int> task = Task.Run(() => text.Length); 
    ... 
} 

ここtextはあなただけFunc<int>を作成しているので、にもかかわらず...変数キャプチャあり、それはメソッドのパラメータを使用してです。

+0

このスレッドは安全ですか? – BVernon

+0

@BVernon:後で 'text'の値を変更しないとすれば、それは私にはうまく見えます。 –

+0

私はちょうど本当に基本的なものを忘れていると思います... DoSomethingをテキスト用に異なる値で複数回呼び出すと、各呼び出しのメモリに各バージョンのコピーが表示されます。 – BVernon

6

Task.Factory.StartNew()オーバーロードを使用して、使用するすべてのパラメータを保持する「状態」オブジェクトを渡すことができます。ここでは、NameValueCollectionを渡す非常に基本的な例がありますが、あなたが望む任意のタイプのオブジェクトを渡すことは明らかです。

Task<bool>.Factory.StartNew(
    (a) => { 
     NameValueCollection nvc = a as NameValueCollection; 
     if(nvc != null) { 
      nvc.AllKeys.ForEach(k => Console.WriteLine(nvc[k])); 
     } 
     return true; 
    }, 
    new NameValueCollection() { { "param1", "hithere!" } }); 
関連する問題