2

PageAsyncTask を使用する次の ASP.NET コードが、そのまま実行しても、PageAsyncTask で 2 行コメントし、Page_load で Thread.Sleep(5000) のコメントを解除しても、合計 8 秒で実行されるのはなぜですか?:

//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- us/library/system.web.ui.pageasynctask.aspx

PreRenderComplete イベントの前に登録された非同期タスクは、まだ実行されていない場合、ページによって自動的に実行されます。PreRenderComplete イベントの後に登録された非同期タスクは、ExecuteRegisteredAsyncTasks メソッドを使用して明示的に実行する必要があります。ExecuteRegisteredAsyncTasks メソッドを使用して、PreRenderComplete イベントの前にタスクを開始することもできます。ExecuteRegisteredAsyncTasks メソッドは、実行されていないページ上の登録済み非同期タスクをすべて実行します。

そのため、開始する前に手動で呼び出す必要がありますExecuteRegisteredAsyncTasks()(何度でも安全に呼び出すことができます) 。または、すべてを別のものに入れます- ただし、5 番目のパラメーター (並列実行用) がであり、そのページ非同期ディレクティブが設定されていることを確認してください: <%@ Page Async="true" %>Page_LoadThread.Sleep()Thread.Sleep()PageAsyncTasktrue

于 2012-03-23T16:49:23.653 に答える