2012-09-14 9 views
5

非同期にコードを実行する場合(async/awaitなど)、適切なタスクが必要です。もちろん、最も頻繁な操作をカバーするフレームワークにはいくつかの事前定義されたメソッドがありますが、時には自分のものを書きたいと思っています。私はC#を初めて使っているので、間違っている可能性はかなり高いですが、少なくとも私の現在の慣行には完全に満足していません。 私がやっている何のために以下の例を参照してください:一般的にカスタムタスクを正しく返す方法

public async Task<bool> doHeavyWork() 
    { 
     var b1 = await this.Foo(); 
     //var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run 
     var b2 = await Task.Run(()=>Bar()); 
     return b1 & b2; 
    } 

public Task<bool> Foo() 
    { 
     return Task.Factory.StartNew(() => 
            { 
             //do a lot of work without awaiting 
             //any other Task 
             return false; 
            }); 
    } 

public bool Bar() 
    { 
     //do a lot of work without awaiting any other task 
     return false; 
    } 

を私が作成し、Fooの例のように、このような方法を消費しますが、見ていないメソッド全体のロジックを含む「余分な」ラムダがあります非常にかわいいイホ。もう一つの選択肢は、Barの例のようなメソッドを消費することですが、BarAsyncのような適切なメソッド名を除いてこのメソッドを非同期で実行し、Task.Factory.StartNewを実行する必要があることが明らかでないため、プログラムで数回繰り返されます。コンパイラにこのメソッドがタスクを返すようにする方法はわかりません。私がやりたいことは、呼び出されたときにタスク全体に包んでください。

最後に私の質問:このような方法を書くにはどうすればよいですか?追加のラムダを取り除くことはできますか?

EDIT Servyが述べたように、メソッドの同期バージョンを使用するのは正当な理由があります。非同期バージョンは、絶対必要な場合にのみ提供する必要があります(Stephen Clearyのリンク)。

+0

'を追加することなく、もちろん「なぜオプションとして拒否するのですか? 'public bool Bar'と' public task BarAsync'を作成します。 – Servy

+0

オーバーヘッドを避けたい。同期または非同期のいずれかの方法を使用することが合理的であれば、それは問題ありません。そうでなければ、パブリックBarAsyncとプライベートバー(それを隠すため)があり、この場合はそれほど理由はありません。 – marce

答えて

3

誰かがBarを新しいスレッド/タスクで起動することなく電話したければ、世界は終わりますか?すでにバックグラウンドスレッドにある別のメソッドがあると、その長い実行コードを実行するために新しいタスクを開始する必要はありません。メソッドがデスクトップアプリケーションコンテキストとASPコンテキストまたはコンソールコンテキストの両方から呼び出されるクラスライブラリにリファクタリングされるとどうなりますか?これらの他のコンテキストでは、このメソッドはおそらく直接実行する必要があり、Taskではなく実行する必要があります。

Taskを開始せずにそのコードを実行する必要がありますが、決して絶対に不可欠でない限り、あなたのコードはBarのようになります。

さらに新しいバージョンの.NETでは、Task.Factory.StartNewからTask.Runに切り替える必要があるので、コード量が少なくなる必要があります。

+1

申し訳ありませんが、あなたの意見を持っています。したがって、通常は悪い考えであるため、このメソッドを「タスク」の機能に強制しないでください:) そしてTask.Runヒントのおかげで、何とかそれを逃しました... – marce

+3

も参照してください:[同期メソッドの非同期ラッパーを公開する必要がありますか? ](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx) –

関連する問題