2015-01-13 5 views
7

として私をタスクを渡す:はので、ここで、私はこれが可能であるかどうかを確認していないパラメータ

私は

async Task MethodA(...) 
{ 
    // some code 
    // a call to specific Async IO bound method 
    // some code 
} 

があるにもMethodB()MethodC()など複数実行するアクションのシーケンスを持っています特定のAsync IOバインドメソッドへの呼び出しを除いて、すべてがまったく同じコードを持っています。メソッドポインタをメソッドに渡す方法を見つけようとしているので、後でMethod()メソッドでそのメソッドを実行することができます。

は何私が現在やっていることはこれです:

private async Task Method(Func<Task<Entity>> func) 
{ 
    // some code 
    var a = await task.Run(func); 
    // some code 
} 

var task = async() => await CallToIOBoundTask(params); 
Method(task); 

このコードは、しかし、IOバインドされたタスクのために必要とされていない新しいスレッドごとに、引っ張る、および避けるべきです。

したがって、ThreadPoolスレッドが使用されないようにコードをリファクタリングする方法はありますか?

private async Task Method(Task<Entity> task) 
{ 
    // some code 
    var a = await task; 
    // some code 
} 

異なるIOコールで異なるメソッドシグネチャがあることも重要です。また、タスクはMethod()本体でのみ実行され、以前は実行できません。もちろん

+0

非同期タスクを開始するための 'Method()'メソッドのステートメントが終了するまで待ちますか?もしそうなら、あなたのコード例は間違っています(作成する代わりに_existing_タスクを待っています)。すでに提供されている答えはあなたが望むものです。しかし、 'Method()'メソッドが呼び出される前に開始したタスクを待つことができるようにしたい場合は、簡単に行うことができます。 'Method()'メソッドの呼び出しの引数として 'CallToIOBoundTask()'への呼び出しの戻り値を渡します。 –

+0

@PeterDunihoあなたの質問への答えは質問の最後の文にあります。タスクはmethod()で実行を開始する必要があります。 – Goran

答えて

16

、単にそれを、funcを呼び出すタスクを取り戻す、とawait

async Task Method(Func<Task<Entity>> func) 
{ 
    // some code 
    var a = await func(); 
    // some code 
} 

をまた、あなたはそのラムダ式を送信しているとき、それはやっているすべてのものでasyncメソッドを呼び出すことであるので、自身がタスクを返し、それ自体でasyncをする必要はありません限り、すべてのこれらの呼び出しはTask<Entity>を返すよう大丈夫です

Method(() => CallToIOBoundTask(params)); 

を。そうでない場合は、Task(操作を開始してその完了を待つことを意味する)のみを使用でき、結果を使用することはできません。

+0

ええ、私はかっこなしで試してみましたが、うまくいきませんでした。 :)あなたの2番目の提案として、ILはこの部分のために何を生成しますか:()=> CallToIOBoundTask(params)?それは非同期のタスクメソッドかどうかですか?私はvoidとして生成されるこのコードを持つことはできません。 – Goran

+0

@Goranこれは 'async'メソッドではありません。 'CallToIOBoundTask'がタスクを返すので、タスクを返します。また、パラメータが 'Action'ではなく' Func > 'なので、無効にすることはできません。そのラムダを '()=> {callToIOBoundTask(params);に戻すことができるようにしたい場合は、 } 'これはまったく同じです。 – i3arnon

関連する問題