微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以在ASP.NET用户控件中使用void async方法吗?

我已成功在ASP.NET Web窗体页面上使用async void方法.但是,当我尝试在Web用户控件中使用相同的方法,然后将此Web用户控件放到具有async =“true”设置的页面时,我不断收到此错误

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” %>.

所以问题是,是否可以在Web用户控件中使用async方法并将其嵌入到启用异步的Web表单页面中?

解决方法

如果它在页面上,您可以拥有一个控制调用异步方法.请参阅以下示例:

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.";
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐