2016-05-24 14 views
0

私たちのASP.NET webformsプロジェクトでは、Page.RegisterAsyncTask()を使用して、私たちのサイトにいくつかの非同期性を追加し始めています。私たちはほとんどのページと私たちのマスターページ(これは別のdllにあります)でPage_Loadイベントを利用しています。Page.RegisterAsyncTaskと従属コード?

If Not IsPostBack Then 
    If Session("Id") Is Nothing Then 
     RegisterAsyncTask(New PageAsyncTask(New Func(Of Task)(Async Function() 
         Await InitializeSessionVariablesAsync(EntryPointCode.AccountAccess) 
              End Function))) 

    End If 

同期モードでマスターページ用Page_Loadを継承ページ用Page_Load後に呼び出されるので、このコードはもちろんの罰金に動作します:私たちが抱えている問題は、マスターページが継承されたフォームが移入というセッション変数を使用しています。上記のコードを使用すると、非同期タスクがまだ実行されていないため、セッション変数を使用しようとするとマスターページにエラーが発生します。あなたが登録した非同期タスクを待つ方法があることを望みます。

RegisterAsyncTaskへの登録後すぐにExecuteRegisteredAsyncTasksを追加しようとしましたが、それは役に立たなかった。

答えて

1

WebFormsのasyncのサポートは少し面倒です。特にtasks registered with RegisterAsyncTask will be executed after PreRendertoo late for Loadです。

マスターコードLoadハンドラをPreRenderCompleteハンドラに変更することが1つの選択肢になることがありますが、これは非同期タスクが完了した後に(正しく理解した場合)発生させる必要があります。あなたのマスターページで、その後

If Session("Id") Is Nothing Then 
    Session("LoadTask") = InitializeSessionVariablesAsync(EntryPointCode.AccountAccess) 
End If 

そうしないと、、セッション中に何かタスク自身を救うことができるかもしれない

Await Session("LoadTask") 

をしかし、これは場合にのみ動作しますin-procセッションプロバイダを使用しています。他のプロバイダーであればシリアル化が必要となり、壊れることになります。

だから、今のところこのコードを同期させておく必要があるかもしれません。 ASP.NET MVCには現在同様の問題があります(非同期フィルタをサポートしていません)。

+0

マスターページで「await」が1つもないと思いますか? – YK1

+0

@ YK1:試してみませんでしたが、マスターページで 'RegisterAsyncTask'(または' async void'ハンドラ)を使用できない理由はありません。 –