PageAsyncTask Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Содержит информацию относительно асинхронной задачи, зарегистрированной на странице. Этот класс не наследуется.
public ref class PageAsyncTask sealed
public sealed class PageAsyncTask
type PageAsyncTask = class
Public NotInheritable Class PageAsyncTask
- Наследование
-
PageAsyncTask
Примеры
В следующем примере кода три асинхронные задачи регистрируются на странице и выполняются параллельно. Каждая задача вызывает метод, который просто приводит поток в спящий режим в течение 5 секунд.
<%@ Page Language="C#" Async="true" AsyncTimeout="35"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
// Define the asynchronuous task.
Samples.AspNet.CS.Controls.SlowTask slowTask1 =
new Samples.AspNet.CS.Controls.SlowTask();
Samples.AspNet.CS.Controls.SlowTask slowTask2 =
new Samples.AspNet.CS.Controls.SlowTask();
Samples.AspNet.CS.Controls.SlowTask slowTask3 =
new Samples.AspNet.CS.Controls.SlowTask();
// <Snippet3>
PageAsyncTask asyncTask1 = new PageAsyncTask(slowTask1.OnBegin, slowTask1.OnEnd, slowTask1.OnTimeout, "Async1", true);
PageAsyncTask asyncTask2 = new PageAsyncTask(slowTask2.OnBegin, slowTask2.OnEnd, slowTask2.OnTimeout, "Async2", true);
PageAsyncTask asyncTask3 = new PageAsyncTask(slowTask3.OnBegin, slowTask3.OnEnd, slowTask3.OnTimeout, "Async3", true);
// Register the asynchronous task.
Page.RegisterAsyncTask(asyncTask1);
Page.RegisterAsyncTask(asyncTask2);
Page.RegisterAsyncTask(asyncTask3);
// </Snippet3>
// Execute the register asynchronous task.
Page.ExecuteRegisteredAsyncTasks();
TaskMessage.InnerHtml = slowTask1.GetAsyncTaskProgress()+ "<br />" + slowTask2.GetAsyncTaskProgress() + "<br />" + slowTask3.GetAsyncTaskProgress();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" 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>
<%@ Page Language="VB" %>
<!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 EventArgs)
' Define the asynchronuous task.
Dim slowTask1 As New Samples.AspNet.VB.Controls.SlowTask()
Dim slowTask2 As New Samples.AspNet.VB.Controls.SlowTask()
Dim slowTask3 As New Samples.AspNet.VB.Controls.SlowTask()
' <Snippet3>
Dim asyncTask1 As New PageAsyncTask(AddressOf slowTask1.OnBegin, AddressOf slowTask1.OnEnd, AddressOf slowTask1.OnTimeout, "Async1", True)
Dim asyncTask2 As New PageAsyncTask(AddressOf slowTask2.OnBegin, AddressOf slowTask2.OnEnd, AddressOf slowTask2.OnTimeout, "Async2", True)
Dim asyncTask3 As New PageAsyncTask(AddressOf slowTask3.OnBegin, AddressOf slowTask3.OnEnd, AddressOf slowTask3.OnTimeout, "Async3", True)
' Register the asynchronous task.
Page.RegisterAsyncTask(asyncTask1)
Page.RegisterAsyncTask(asyncTask2)
Page.RegisterAsyncTask(asyncTask3)
' </Snippet3>
' Execute the register asynchronous task.
Page.ExecuteRegisteredAsyncTasks()
TaskMessage.InnerHtml = slowTask1.GetAsyncTaskProgress() + "<br />" + slowTask2.GetAsyncTaskProgress() + "<br />" + slowTask3.GetAsyncTaskProgress()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<span id="TaskMessage" runat="server">
</span>
</div>
</form>
</body>
</html>
using System;
using System.Web;
using System.Web.UI;
using System.Threading;
namespace Samples.AspNet.CS.Controls
{
public class SlowTask
{
private String _taskprogress;
private AsyncTaskDelegate _dlgt;
// Create delegate.
protected delegate void AsyncTaskDelegate();
public String GetAsyncTaskProgress()
{
return _taskprogress;
}
public void ExecuteAsyncTask()
{
// Introduce an artificial delay to simulate a delayed
// asynchronous task.
Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Define the method that will get called to
// start the asynchronous task.
public IAsyncResult OnBegin(object sender, EventArgs e,
AsyncCallback cb, object extraData)
{
_taskprogress = "AsyncTask started at: " + DateTime.Now + ". ";
_dlgt = new AsyncTaskDelegate(ExecuteAsyncTask);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);
return result;
}
// Define the method that will get called when
// the asynchronous task is ended.
public void OnEnd(IAsyncResult ar)
{
_taskprogress += "AsyncTask completed at: " + DateTime.Now;
_dlgt.EndInvoke(ar);
}
// Define the method that will get called if the task
// is not completed within the asynchronous timeout interval.
public void OnTimeout(IAsyncResult ar)
{
_taskprogress += "AsyncTask failed to complete " +
"because it exceeded the AsyncTimeout parameter.";
}
}
}
Imports System.Threading
Namespace Samples.AspNet.VB.Controls
Public Class SlowTask
Private _taskprogress As String
Private _dlgt As AsyncTaskDelegate
' Create delegate.
Protected Delegate Sub AsyncTaskDelegate()
Public Function GetAsyncTaskProgress() As String
Return _taskprogress
End Function
Public Sub ExecuteAsyncTask()
' Introduce an artificial delay to simulate a delayed
' asynchronous task.
Thread.Sleep(TimeSpan.FromSeconds(5.0))
End Sub
' 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 = "AsyncTask started at: " + DateTime.Now.ToString + ". "
_dlgt = New AsyncTaskDelegate(AddressOf ExecuteAsyncTask)
Dim result As IAsyncResult = _dlgt.BeginInvoke(cb, extraData)
Return result
End Function
' Define the method that will get called when
' the asynchronous task is ended.
Public Sub OnEnd(ByVal ar As IAsyncResult)
_taskprogress += "AsyncTask completed at: " + DateTime.Now.ToString
_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 += "AsyncTask failed to complete " + _
"because it exceeded the AsyncTimeout parameter."
End Sub
End Class
End Namespace
Комментарии
ASP.NET версии 2.0 позволяет регистрировать несколько задач на странице и выполнять их асинхронно перед отрисовкой страницы. Можно указать, что задача выполняется асинхронно, если это медленный процесс и вы не хотите, чтобы другие процессы были связаны во время выполнения. Асинхронные задачи могут выполняться параллельно или последовательно.
Объект PageAsyncTask должен быть зарегистрирован на странице с помощью RegisterAsyncTask метода . Сама страница не обязательно обрабатываться асинхронно для выполнения асинхронных задач. Для атрибута Async
true
можно задать значение (как показано в следующем примере кода) или false
в директиве page, и асинхронные задачи по-прежнему будут обрабатываться асинхронно:
<%@ Page Async="true" %>
Если для атрибута Async
задано значение false
, поток, выполняющий страницу, будет заблокирован до завершения всех асинхронных задач.
Все асинхронные задачи, зарегистрированные до PreRenderComplete события, будут автоматически выполняться страницей, если они еще не выполнены. Эти асинхронные задачи, зарегистрированные после PreRenderComplete события, должны выполняться явным ExecuteRegisteredAsyncTasks образом с помощью метода . Метод ExecuteRegisteredAsyncTasks также можно использовать для запуска задач перед событием PreRenderComplete . Метод ExecuteRegisteredAsyncTasks выполняет все зарегистрированные асинхронные задачи на странице, которые не были выполнены.
По умолчанию время ожидания асинхронной задачи истекает, если она не была завершена в течение 45 секунд. В файле Web.config или директиве page можно указать другое значение времени ожидания. Раздел <pages>
файла Web.config содержит asyncTimeout
атрибут , как показано ниже.
<system.web>
<pages asyncTimeout="30">
</pages>
</system.web>
Директива page содержит AsyncTimeout
атрибут .
<%@ Page AsyncTimeout="30" %>
Конструкторы
PageAsyncTask(BeginEventHandler, EndEventHandler, EndEventHandler, Object) |
Инициализирует новый экземпляр класса PageAsyncTask с использованием заданного по умолчанию значения для параллельного выполнения. |
PageAsyncTask(BeginEventHandler, EndEventHandler, EndEventHandler, Object, Boolean) |
Инициализирует новый экземпляр класса PageAsyncTask с использованием указанного значения для параллельного выполнения. |
PageAsyncTask(Func<CancellationToken,Task>) |
Инициализирует новый экземпляр класса PageAsyncTask, используя обработчик событий, позволяющий отменить задачу. |
PageAsyncTask(Func<Task>) |
Инициализирует новый экземпляр класса PageAsyncTask, используя обработчик событий, позволяющий обработать задачу. |
Свойства
BeginHandler |
Возвращает метод для вызова при запуске асинхронной задачи. |
EndHandler |
Возвращает метод для вызова при успешном завершении задачи до истечения времени ожидания. |
ExecuteInParallel |
Возвращает значение, показывающее, может ли данная задача обрабатываться параллельно с другими задачами. |
State |
Возвращает объект, который представляет состояние задачи. |
TimeoutHandler |
Возвращает метод для вызова в случае, если задача не завершилась успешно до истечения времени ожидания. |
Методы
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |