2016-04-26 9 views
3

Page_Loadに登録されたGetDataタスクは、非同期タスクなのでIndex.aspxのロードをブロックしないと考えました。ページがレンダリングされてから5秒後にlblDataが設定され、Index.aspxに反映されます。`Page_Load`に登録された` PageAsyncTask`が同期して動いているのはなぜですか?

私の場合、Index.aspxのロードは、非同期GetDataが完了するのを待って、5秒間ブロックされます。は5秒後にレンダリングされます。

これは予想されますか?または、私が何か問題があったためにGetDataが同期して実行されていますか?

// Index.aspx.cs 
public partial class Index : Page 
{ 
    protected string lblData; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     RegisterAsyncTask(new PageAsyncTask(GetData)); 
     ExecuteRegisteredAsyncTasks(); 
    } 

    public async Task GetData() 
    { 
     await Task.Delay(5000); 
     lblData = "Hello world!"; 
    } 
    // ... 
} 

私はIndex.aspxAsync="true"を追加しました。

+0

詳細RegisterAyncTaskが役立つかもしれません。https://msdn.microsoft.com/en-us/library/system.web.ui.page.registerasynctask(v=vs.110).aspx – Eldho

+0

同様のhttp: //stackoverflow.com/q/31567515/1876572 RegisterAsyncTaskで接続されたメソッドはPreRenderの直後に実行されると述べています。 – Eldho

答えて

5

"非同期"は修飾語です。あなたはいつも「何に関して非同期ですか?」と尋ねなければなりません。

この場合、タスクは要求を処理するワーカースレッドに関して非同期です。重要な点は、ほとんどの種類の非同期タスクを処理している間に要求スレッドをブロックする必要がないため、サーバーはより多くの要求を同時に処理できる一方で、少ないリソースでこれを処理できることです。

リクエスト処理は依然として完全に同期しており、レスポンス全体が準備完了のときにのみ送信されます(Flushを明示的に使用しない限り、リクエスト処理自体は非同期ではありません)それはまったく別のワームです)。実際、awaitの全体のポイントは、スレッド、I/O、UIに関して非同期である間に、コードが同期しているかのように動作するようにすることです。 awaitは明示的な同期ポイントです。

実際、最初の場所で非同期インフラストラクチャを使用しているのは、まさにその理由です。 を非同期タスクRegisterAsyncTaskなしで使用した場合、応答は完全に完了する前に終了します。インフラストラクチャでは、ワーカースレッドを必要としない間に解放することができますが、非同期作業から戻ってくる間は、関連するすべての要求コンテキストを準備しておく必要があります。これは、コンソールアプリケーションのMainメソッドでawaitを使用するのと似ています。インフラストラクチャが準備されていない場合、awaitは、return someTask;を意味するだけで、「タスクが完了するとここに戻ってきません。

要求の処理をブロックしないものが必要な場合は、要求に対して非同期のである必要があります。例えば、ページは別のAJAXリクエストをサーバーに送信して、より多くのデータを提供することができます。

+0

私よりも良い答え。 – Alexander

1

MSDNによれば、すべてを正しく実行しています。私は、間違っている場合は、ページがロードされ、レンダリングされ、クライアントに返されると間違って仮定していると仮定します。これは正しくない場合はGetData関数で定義された非同期操作です。

ライフサイクル(非同期中)は、すべての作業が完了するまでクライアントに戻りません。ここにはSO Q & Aがあります。 Scott Hanselman hereからのさらに詳しい説明。

+0

間違った仮定は私が作ったものです。答えとリンクに感謝します:) – Moon

0

おそらく非同期に実行されていますが、それでもコードビハインドであり、レンダリングされたページがブラウザに送信される前にコードビハインドが実行され、サーバーで終了します。

ページがブラウザに読み込まれた後にグリッドを動的に埋めたい場合は、JavaScriptとWebMethodsまたはWebAPIなどを使用する必要があります。

+0

*それはまだ "コードの背後にある" ... "あなたの簡潔な答えをありがとう:) – Moon

関連する問題