2017-12-08 12 views
4

クラス内で非同期メソッドを呼び出すWebページ(aspx)があります。最後に待つ前に非同期メソッドから戻ることはできますか?

public async Task<MyThing> GetMyThing() 
{ 
    MyThing thing = new MyThing(); 
    var stuff = await Repository.GetStuff(); 
    // apply stuff to thing. 

    var morestuff = await Repository.GetMoreStuff(); 
    // apply more stuff to thing. 

    if (someCondition) 
    { 
     return thing; 
    } 

    var yetMoreStuff = await Repository.GetYetMoreStuff(); 
    // apply yet more stuff 

    return thing; 
} 

条件が満たされた場合、私は最後のリポジトリの呼び出しからのデータを必要としない:非同期メソッドは次のようになります。最終的に私に問題を引き起こすのを待つ前にリターンですか?

私が尋ねる理由は、私は、サーバーのアプリケーションログに、このエラーを取得しています、と私は原因を探してるです...

Application: w3wp.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.NullReferenceException 
    at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean) 
    at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(System.Threading.SendOrPostCallback, System.Object) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallback(System.Threading.SendOrPostCallback, System.Object) 
    at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(System.Threading.ContextCallback, System.Object, System.Threading.Tasks.Task ByRef) 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
+2

あなたが '戻る'なら、 'await'はまったく起こりません。 – SLaks

+2

あなたはそのコードをステップ実行する必要があります。それはNREの問題です。 – Nkosi

+0

エラーはスレッディングのためではありませんが、リポジトリ内の例外がバブルアップしています。 – Chad

答えて

7

はい、特定の非同期操作を実行しないように完全に罰金です。あなたが持っているものは大丈夫です。何はそう罰金ではないでしょうと、次のようになります。

var notYetAwaited = DoSomethingAsync(); 

if (done) return "yay!"; 

await notYetAwaited; 

すなわちリターンをまたがるasync操作。これは、特に同期コンテキスト環境では、あまり明白でなく予測可能な動作をします。

返品のために問題が発生する可能性は低いです。これは、同期コンテキストコールバックで浮上しているデータコード内で起こっているNREです。

関連する問題