Время PageAsyncTask совпадает с последовательным процессом? - PullRequest
2 голосов
/ 31 января 2012

Почему следующий код ASP.NET с использованием PageAsyncTask выполняется в общей сложности 8 секунд, независимо от того, запускаю ли я его как есть или комментирую ли 2 строки с помощью PageAsyncTask и не комментирую Thread.Sleep (5000) в Page_load?:

//PageAsyncTask asyncTask1 = new PageAsyncTask(BeginAsyncOperation, EndAsyncOperation,<br> OperationTimeOut, arr, true); //Page.RegisterAsyncTask(asyncTask1);</p> <p>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/>");
    }

}

1 Ответ

3 голосов
/ 23 марта 2012

Это потому, что вы фактически не запускаете ничего параллельно - все PageAsyncTask запускаются при вызове метода страницы ExecuteRegisteredAsyncTasks(), и это происходит автоматически сразу после Page_PreRenderPage_PreRenderComplete) запускается после завершения всех заданий или времени ожидания): http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask.aspx

Любые асинхронные задачи, зарегистрированные до события PreRenderComplete, будут автоматически выполняться страницей, если они еще не были выполнены. Эти асинхронные задачи, зарегистрированные после события PreRenderComplete, должны выполняться явно с помощью метода ExecuteRegisteredAsyncTasks. Метод ExecuteRegisteredAsyncTasks также можно использовать для запуска задач перед событием PreRenderComplete. Метод ExecuteRegisteredAsyncTasks выполняет все зарегистрированные асинхронные задачи на странице, которые не были выполнены.

Таким образом, вам придется вручную вызвать ExecuteRegisteredAsyncTasks() (можно безопасно вызывать любое количество раз) в Page_Load до начала любого Thread.Sleep(). Или поместите каждый Thread.Sleep() в разные PageAsyncTask - но убедитесь, что пятый параметр (для параллельного выполнения) равен true, и что указана асинхронная страница: <% @ Page Async = "true"%>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...