として私をタスクを渡す:はので、ここで、私はこれが可能であるかどうかを確認していないパラメータ
私は
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()
本体でのみ実行され、以前は実行できません。もちろん
非同期タスクを開始するための 'Method()'メソッドのステートメントが終了するまで待ちますか?もしそうなら、あなたのコード例は間違っています(作成する代わりに_existing_タスクを待っています)。すでに提供されている答えはあなたが望むものです。しかし、 'Method()'メソッドが呼び出される前に開始したタスクを待つことができるようにしたい場合は、簡単に行うことができます。 'Method()'メソッドの呼び出しの引数として 'CallToIOBoundTask()'への呼び出しの戻り値を渡します。 –
@PeterDunihoあなたの質問への答えは質問の最後の文にあります。タスクはmethod()で実行を開始する必要があります。 – Goran