2016-12-09 3 views
-3

私は、非同期メソッドを宣言/消費するには2つの方法があります。待っている結果とタスクラップされたオブジェクトを返した場合の違いは何ですか?

Class MyClass 
{ 
    ... 
    protected IDbSet<TEntity> IDbSet; 
    ... 


    public virtual Task<TEntity> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate) 
    { 
     return IDbSet.FirstOrDefaultAsync(predicate); 
    } 
} 

(消費)

public async Task<MyViewModel> GetItemByNumber(int itemNumber) 
    { 
     var model = await GetFirstOrDefaultAsync(c => c.ItemNumber == itemNumber); 
     if (model == null) 
      return new MyViewModel(); 
     return AutoMapper.Mapper.Map<Model, MyViewModel>(model); 
    } 

ウェイ2
を(1

だが、私は方法があるとしましょう

ウェイ(宣言)見てみよう宣言)

Class MyClass 
{ 
    ... 
    protected IDbSet<TEntity> IDbSet; 
    ... 


    public virtual async /* added this here */ Task<TEntity> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate) 
    { 
     // now returning the awaited result 
     return await /*added here*/ IDbSet.FirstOrDefaultAsync(predicate); 
    } 
} 

(消費)今

public async Task<MyViewModel> GetItemByNumber(int itemNumber) 
    { 
     var model = await GetFirstOrDefaultAsync(c => c.ItemNumber == itemNumber); 
     if (model == null) 
      return new MyViewModel(); 
     return AutoMapper.Mapper.Map<Model, MyViewModel>(model); 
    } 

、あなたが見ることができるように、私は両方のケースでの方法と同じ方法を消費していますが、私は違った彼らを宣言しました。最初のものでは、私はタスクを返す、2番目のものでは、待っている結果を戻しているが、どちらが実際に非同期であるか(または両方があるかどうかわからない)。それをさらに混乱させるために、Visual Studioインテリセンスは、(いずれの場合も)がお待ちしていますと述べています。

だから私は知りたい、

1)両方のバージョンの違いは何ですか?
2)どちらか一方が他方より速く/遅くなっていますか?
3)どちらが優先し、なぜですか?
4)は、彼らがこれだったと私は質問を読んで、両方の非同期(私はそうだろうこれに対する答えを推測していますが、念のために)

EDIT/UPDATE

、です重複としてマークされています。私はthisthis one、そしてthis oneも行った。彼らは私がいくつかの問題をクリアするのを助けてくれましたが、まだ不明な点がいくつかあります。

1)differnceがdisposing patternにあることを理解しています。 Deadlocking and exception handling
2)someanswers(もちろん、only under certain circumstances)によると、タスクバージョンはコンパイル/実行が速くなるはずです。
3)最初の質問に対する回答(例外処理と同期コンテキストに関する投稿は、同じ方法で他のタスクを待つ必要がある場合、 this answerにエクスパールされました)
4)私はまだこの1つではっきりしていませんthis answerによれば、(第2のポイント)第1のもの(方法1)は、第2のものがaysncではない。私はまた、答えに記載された記事を読むことを試みましたが、最初のものが非同期的にどのように実行されないかをはっきりと理解できませんでした。もし誰かがこの最後の欠けているパズルを理解するのを助けることができれば、それは素晴らしいものになるでしょう。

+0

@Servy:質問を更新しました。 – Razort4x

+0

@Downvoter:あなたがdownvote場合は、少なくとも私は覚えて、改善することができますコメントを残してくださいと、downvoteを引き付けるかもしれない次回何かを投稿しないでください。 – Razort4x

+0

あなたは彼らの行動がまったく同じであることを理解していますが、その機能性については何も違いはありませんが、それらのうちの1つは非同期であり、 ?本当に? – Servy

答えて

0

この回答によれば、第1の方法(方法1)はaysncではなく、第2の方法はaysncである。

その答えは間違っています。両方とも非同期です。

関連する問題