我已成功在ASP.NET Web窗体页面上使用async void方法.但是,当我尝试在Web用户控件中使用相同的方法,然后将此Web用户控件放到具有async =“true”设置的页面时,我不断收到此错误:
An asynchronous operation cannot be started at this time. Asynchronous operations may
@H_403_9@
only be started within an asynchronous
handler or module or during certain events in the Page lifecycle. If
this exception occurred while executing a Page,ensure that the Page
is marked <%@ Page Async=”true” %>.
解决方法
如果它在页面上,您可以拥有一个控制调用异步方法.请参阅以下示例:
Page.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page.aspx.cs" Inherits="AsyncDEmo.Page" Async="true" %> <%@ Register Src="~/Control.ascx" TagPrefix="uc1" TagName="Control" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <uc1:Control runat="server" id="Control" /> </form> </body> </html>
Page.aspx的代码隐藏是空的
Control.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control.ascx.cs" Inherits="AsyncDEmo.Control" %> <span id="TaskMessage" runat="server"> </span>
控制代码隐藏
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(); 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); // Execute the register asynchronous task. Page.ExecuteRegisteredAsyncTasks(); TaskMessage.InnerHtml = slowTask1.GetAsyncTaskProgress() + "<br />" + slowTask2.GetAsyncTaskProgress() + "<br />" + slowTask3.GetAsyncTaskProgress(); }
SlowClass.cs
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."; } }