2

为什么以下使用 PageAsyncTask 的 ASP.NET 代码总共执行 8 秒,无论我是按原样运行它还是我用 PageAsyncTask 注释 2 行并在 Page_load 中取消注释 Thread.Sleep(5000)?:

//PageAsyncTask asyncTask1 = new PageAsyncTask(BeginAsyncOperation, EndAsyncOperation,
OperationTimeOut, arr, true); //Page.RegisterAsyncTask(asyncTask1);

Thread.Sleep(5000);

我知道 PageAsyncTask 与其他任务并行运行一个任务,并且在这种情况下应该使页面加载的整个过程更快。我错过了什么?

public partial class _Default : System.Web.UI.Page
{
    public delegate string foo(string param1, string param2);
    public IAsyncResult BeginLongRunningTransaction(AsyncCallback cb, object state)
    {
        var arr = (string[])state;
        string z1 = arr[0];
        string z2 = arr[1];

        foo method = this.LongRunningTransaction;
        return method.BeginInvoke(z1, z2, cb, state);
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(DateTime.Now.ToString() + "<br/>");
        string[] arr = { "Zorik1", "Zorik2" };


        // if I comment following two lines and un-comment
        // Thread.Sleep(5000) command the process runs 8 sec. regardless
        PageAsyncTask asyncTask1 = new PageAsyncTask(BeginAsyncOperation, EndAsyncOperation, OperationTimeOut, arr, true);
        Page.RegisterAsyncTask(asyncTask1);


        //Thread.Sleep(5000);
        Thread.Sleep(1000);
        Thread.Sleep(1000);
        Thread.Sleep(1000);
    }

    private IAsyncResult BeginAsyncOperation(object sender, EventArgs e,
     AsyncCallback cb, object state)
    {
        return this.BeginLongRunningTransaction(cb, state);
    }

    private string LongRunningTransaction(string param1, string param2)
    {
        Thread.Sleep(5000);
        txtAsync.Text = "Updated";
        updPnl1.Update();
        return "this is return string";
    }


    private void EndAsyncOperation(IAsyncResult ar)
    {

    }

    private void OperationTimeOut(IAsyncResult asyncResult)
    {
        string a = "";
    }

    protected void Page_PreRender(object s, EventArgs e)
    {
        string a = "";
        Response.Write(DateTime.Now.ToString() + "<br/>");
    }

    protected void Page_PreRenderComplete(object s, EventArgs e)
    {
        Response.Write(DateTime.Now.ToString() + "<br/>");
    }

}
4

1 回答 1

3

那是因为实际上并没有并行运行任何东西 - 所有PageAsyncTask都在ExecuteRegisteredAsyncTasks()页面方法调用上运行,并且在结束后自动发生Page_PreRender(并Page_PreRenderComplete在所有任务完成或超时后开始):http: //msdn.microsoft.com/en-我们/图书馆/system.web.ui.pageasynctask.aspx

在 PreRenderComplete 事件之前注册的任何异步任务如果尚未执行,则页面将自动执行它们。在 PreRenderComplete 事件之后注册的那些异步任务必须通过 ExecuteRegisteredAsyncTasks 方法显式执行。ExecuteRegisteredAsyncTasks 方法也可用于在 PreRenderComplete 事件之前启动任务。ExecuteRegisteredAsyncTasks 方法执行页面上所有尚未执行的已注册异步任务。

因此,您必须在任何开始之前手动调用ExecuteRegisteredAsyncTasks()(可以安全地调用任意次数) 。或者把每个都放在不同的地方——但要确保第五个参数(用于并行执行)是,并且设置了页面异步指令:<%@ Page Async="true" %>Page_LoadThread.Sleep()Thread.Sleep()PageAsyncTasktrue

于 2012-03-23T16:49:23.653 回答