2017-09-25 1 views
0

せずにタスクを作成します。代わりにラムダ式を関数を渡すしようとすると、最終的にラインアップなぜ混合ラムダ

int t2 = await Task.Run(()=>Allocate2()); 

にエラーが発生しません。このラムダ式()=>Allocate2()Taskを返します。なぜエラーがない?

関数Allocateでラムダ式を使用しないタスクを作成するにはどうすればよいですか?

static async void Example() 
    { 

     int t = await Task.Run(Allocate); 
     int t2 = await Task.Run(()=>Allocate2()); 
     Console.WriteLine("Compute: " + t); 
    } 


static Task<int> Allocate() 
    { 
    return 1; 
    } 


static int Allocate2() 
    { 
    return 1; 
    } 
+3

['Task.Run'](https://msdn.microsoft.com/en-us/library/hh195051(v = vs.110).aspx)は' Task'を返します。このタスクが内部で行っていることは別の話です(オーバーロードを参照)。 – Sinatr

+0

これを実行していますが、「戻り値の型が一致していないため、暗黙のうちに型 'int'を 'System.Threading.Tasks.Task 'に変換できません。あなたが達成しようとしていることは何ですか? –

+0

私はラムダ式 – vico

答えて

3

Task.Run()あなたがそれをパラメータなしActionまたはFuncを渡したいです。

ラムダはActionまたはFunc(適切な場合)に割り当てることができます。その理由は、ラムダを使用してTask.Run()を呼び出すことが効果的です。

あなたは、ラムダを使用したくない場合は、明示的またはActionFuncのコンストラクタに呼び出したいメソッドを渡し、ActionまたはFuncを作成する必要があります。

以下が示しています。

static void Main() 
{ 
    var task = Task.Run(new Action(MyMethod)); 
} 

static void MyMethod() 
{ 
    Console.WriteLine("MyMethod()"); 
} 

OR:メソッドは、1つまたは複数のパラメータを必要とする場合、これは動作しないことを

static void Main() 
{ 
    var task = Task.Run(new Func<int>(MyMethod)); 
} 

static int MyMethod() 
{ 
    Console.WriteLine("MyMethod()"); 
    return 42; 
} 

注意を。その場合、ラムダを使用する必要があります。

+0

'new' ing。 –

+0

この場合の明示的キャストの使い方は? – vico

+0

@vicoそれを以下のようにキャストできます: 'var task = Task.Run((Func )MyMethod);' - しかし、それは改善だとは本当に思いません。実際には、生成されるコードは多かれ少なかれ同じです。 (詳細は[こちら](https://stackoverflow.com/questions/24705925/cast-to-func-vs-new-func)を参照してください) –

関連する問題