私はC#でいくつかの非同期プログラミングを見ていますが、まったく同じことをしていて、すべて待っているこれらの関数の違いは何か不思議でした。これらの魅力的な方法の違いは何ですか?
public Task<Bar> GetBar(string fooId)
{
return Task.Run(() =>
{
var fooService = new FooService();
var bar = fooService.GetBar(fooId);
return bar;
});
}
public Task<Bar> GetBar(string fooId)
{
var fooService = new FooService();
var bar = fooService.GetBar(fooId);
return Task.FromResult(bar)
}
public async Task<Bar> GetBar(string fooId)
{
return await Task.Run(() =>
{
var fooService = new FooService();
var bar = fooService.GetBar(fooId);
return bar;
});
}
私の推測では、最初は、物事を行うには正しい方法で、あなたが返されるタスクから結果を取得しようとするまでのコードが実行されていないということです。
コールでコードが実行され、結果が返されたタスクに格納されます。
第3の種類は第2の種類のようですか?コードはコール時に実行され、Task.Runの結果はリターンですか?その場合、この機能は愚かなものでしょうか?
私は正しいのですか?
最初は非同期で実行され、2番目は実行されずブロックされます。結果はタスクに同期してラップされて返されます。 3つ目は最初のものとほとんど同じです - 'async/await'は単純にawatingを簡単にします。それは非同期的なものではありません。実際に関数 –
PSの中で結果が使用されないので、3番目のものは実際には不要なひょうたんを持っています。 –
注:これは "async over sync"です:バックエンドサービス( 'GetBar')は基本的に同期APIであり、あなたはそれを公開しています。 'async'シムこれを行う*唯一の理由は、UIのペイントを解放するようなものです。これは、より広範な 'async'目標を達成していません。あなたはまだ**スレッドが結果をブロックしています - 元の*スレッドではありません。 –