2013-03-03 25 views
8

Tôi đã sử dụng thành công phương thức async void trên các trang Biểu mẫu web ASP.NET. Tuy nhiên, khi tôi cố gắng sử dụng cùng một phương pháp trong một điều khiển người dùng web, và sau đó đặt điều khiển này người dùng web đến một trang với async="true" thiết lập, tôi tiếp tục nhận được lỗi này:Có thể vô hiệu hóa phương thức async được sử dụng trong điều khiển người dùng ASP.NET không?

An asynchronous operation cannot be started at this time. Asynchronous operations may 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" %>.

Vì vậy, câu hỏi là, có thể void async phương pháp nào được sử dụng trong điều khiển người dùng web và được nhúng trong trang biểu mẫu web được bật async?

Trả lời

6

Bạn có thể có một phương thức không đồng bộ của cuộc gọi điều khiển nếu nó nằm trên một trang. Xem ví dụ dưới đây:

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> 

Các codebehind của Page.aspx trống

Control.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control.ascx.cs" Inherits="AsyncDEmo.Control" %> 

<span id="TaskMessage" runat="server"> 
     </span> 

kiểm soát 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."; 
    } 
} 
Các vấn đề liên quan