Is it possible to use an asynchronous method in an ASP.NET user control?

I have successfully used the async void method in ASP.NET Web Forms pages. However, when I tried to use the same method in a web user control, and then placed this website control on a page with the async="true" parameter, I continue to get this error:

An asynchronous operation cannot be started at this time. Asynchronous operations can only be started in the asynchronous mode of the handler or module or during certain events in the page life cycle. If this exception occurred while executing the page, make sure the Page is tagged <% @Page Async = "true"%>.

So the question is, can the void async method be used in web user management and embedded in a web form page with asynchronization support?

+8
asynchronous void user-controls
source share
1 answer

You can use asynchronous control invocation methods if they are on the page. See the example below:

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> 

Code code.aspx is empty

Control.ascx

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control.ascx.cs" Inherits="AsyncDEmo.Control" %> <span id="TaskMessage" runat="server"> </span> 

Control codebehind

 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."; } } 
+6
source share

All Articles