Assembly: System.Web (in system.web.dll)
Define an asynchronous task using the PageAsyncTask class. After the task is defined, and is registered with the page using the RegisterAsyncTask method, the ExecuteRegisteredAsyncTasks method can be invoked to begin the asynchronous task.
The ExecuteRegisteredAsyncTasks method is automatically called at the point in the page processing when any registered asynchronous tasks, if they exist, are invoked for a non-asynchronous page. This automatic call to ExecuteRegisteredAsyncTasks occurs just before the PreRenderComplete event. Call the ExecuteRegisteredAsyncTasks method for tasks you want to be invoked at times other than the automatic call to this method. Note, asynchronous tasks will be executed only once even though ExecuteRegisteredAsyncTasks may be called more than once.
The AsyncTimeout property is reset on every call to the ExecuteRegisteredAsyncTasks method. The last value of the AsyncTimeout prior to invoking the ExecuteRegisteredAsyncTasks method takes precedence. If an asynchronous task takes more than the AsyncTimeout, subsequent tasks invoked during that ExecuteRegisteredAsyncTasks call are timed out immediately.
The following code example demonstrates the use of the AsyncTimeout property with the ExecuteRegisteredAsyncTasks and RegisterAsyncTask methods. Note the use of beginning, ending, and time-out handlers. In the example, an artificial delay is introduced to demonstrate the situation of an asynchronous task exceeding the allotted time for the task as specified in the AsyncTimeout property. In a real-world scenario, an asynchronous task could be used to perform database calls or image generation, for example, and the time-out handler provides graceful degradation if the task is not performed in a specified amount of time.
<%@ Page Language="VB" AsyncTimeout="2"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) ' Define the asynchronuous task. Dim mytask As New Samples.AspNet.VB.Controls.MyAsyncTask() Dim asynctask As New PageAsyncTask(AddressOf mytask.OnBegin, AddressOf mytask.OnEnd, AddressOf mytask.OnTimeout, DBNull.Value) ' Register the asynchronous task. Page.RegisterAsyncTask(asynctask) ' Execute the register asynchronous task. Page.ExecuteRegisteredAsyncTasks() TaskMessage.InnerHtml = mytask.GetAsyncTaskProgress() End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Asynchronous Task Example</title> </head> <body> <form id="form1" runat="server"> <div> <span id="TaskMessage" runat="server"> </span> </div> </form> </body> </html>
Imports Microsoft.VisualBasic Imports System Imports System.Web Imports System.Web.UI Imports System.Threading Namespace Samples.AspNet.VB.Controls Public Class MyAsyncTask Private _taskprogress As String Private _dlgt As AsyncTaskDelegate ' Create delegate. Delegate Function AsyncTaskDelegate() Public Function GetAsyncTaskProgress() As String Return _taskprogress End Function Public Function DoTheAsyncTask() ' Introduce an artificial delay to simulate a delayed ' asynchronous task. Make this greater than the ' AsyncTimeout property. Thread.Sleep(TimeSpan.FromSeconds(5.0)) End Function ' Define the method that will get called to ' start the asynchronous task. Public Function OnBegin(ByVal sender As Object, ByVal e As EventArgs, ByVal cb As AsyncCallback, ByVal extraData As Object) As IAsyncResult _taskprogress = "Beginning async task." Dim _dlgt As New AsyncTaskDelegate(AddressOf DoTheAsyncTask) Dim result As IAsyncResult = _dlgt.BeginInvoke(cb, extraData) Return result End Function 'OnBegin ' Define the method that will get called when ' the asynchronous task is ended. Public Sub OnEnd(ByVal ar As IAsyncResult) _taskprogress = "Asynchronous task completed." _dlgt.EndInvoke(ar) End Sub ' Define the method that will get called if the task ' is not completed within the asynchronous timeout interval. Public Sub OnTimeout(ByVal ar As IAsyncResult) _taskprogress = "Ansynchronous task failed to complete because " & _ "it exceeded the AsyncTimeout parameter." End Sub End Class End Namespace