Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PageAsyncTask时间是否与顺序进程相同?_C#_Asp.net_.net_Asynchronous_Pageasynctask - Fatal编程技术网

C# PageAsyncTask时间是否与顺序进程相同?

C# PageAsyncTask时间是否与顺序进程相同?,c#,asp.net,.net,asynchronous,pageasynctask,C#,Asp.net,.net,Asynchronous,Pageasynctask,为什么使用PageAsyncTask的以下ASP.NET代码在总共8秒的时间内执行,而不管我是按原样运行,还是使用PageAsyncTask和un comment Thread.Sleep(5000)在Page_load中注释2行 //PageAsyncTask asyncTask1=新的PageAsyncTask(BeginAsyncCoperation, EndAsyncOperation, 操作超时,arr,true); //Page.RegisterAsyncTask(异步任务1) 睡

为什么使用PageAsyncTask的以下ASP.NET代码在总共8秒的时间内执行,而不管我是按原样运行,还是使用PageAsyncTask和un comment Thread.Sleep(5000)在Page_load中注释2行


//PageAsyncTask asyncTask1=新的PageAsyncTask(BeginAsyncCoperation,
EndAsyncOperation,
操作超时,arr,true); //Page.RegisterAsyncTask(异步任务1)

睡眠(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/>");
    }

}
public分部类\u默认值:System.Web.UI.Page
{
公共委托字符串foo(字符串param1,字符串param2);
公共IAsyncResult BeginLongRunningTransaction(异步回调cb,对象状态)
{
var arr=(字符串[])状态;
字符串z1=arr[0];
字符串z2=arr[1];
foo method=this.LongRunningTransaction;
返回方法.BeginInvoke(z1、z2、cb、状态);
}
受保护的无效页面加载(对象发送方、事件参数e)
{
Write(DateTime.Now.ToString()+“
”); 字符串[]arr={“Zorik1”,“Zorik2”}; //如果我在下面两行加上注释并取消注释 //Thread.Sleep(5000)命令进程运行8秒 PageAsyncTask asyncTask1=新的PageAsyncTask(BeginAsyncCoperation,EndAsyncOperation,OperationTimeOut,arr,true); Page.RegisterAsyncTask(异步任务1); //睡眠(5000); 睡眠(1000); 睡眠(1000); 睡眠(1000); } 私有IAsyncResult BeginAsyncOperation(对象发送方、事件参数、, 异步(对象状态) { 返回此.BeginLongRunningTransaction(cb,状态); } 私有字符串LongRunningTransaction(字符串参数1,字符串参数2) { 睡眠(5000); txtAsync.Text=“已更新”; updPnl1.Update(); return“这是返回字符串”; } 私有void EndAsyncOperation(IAsyncResult ar) { } 私有void操作超时(IAsyncResult asyncResult) { 字符串a=“”; } 受保护的空页\u预呈现(对象s、事件参数e) { 字符串a=“”; Write(DateTime.Now.ToString()+“
”); } 受保护的无效页面\u预渲染完成(对象s、事件参数e) { Write(DateTime.Now.ToString()+“
”); } }
这是因为您实际上并没有并行运行任何东西-所有
PageAsyncTask
都是在
ExecuteRegisteredAsyncTasks()
page方法调用上运行的,这会在
page\u PreRender
结束后自动发生(并且在所有任务完成或超时后开始执行
Page\u PreRenderComplete
):

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


因此,在任何
线程.Sleep()
启动之前,您必须在
页面加载中手动调用
ExecuteRegisteredAsyncTasks()
(可以安全地调用任意次数),或者将每个
线程.Sleep()
放在不同的
页面异步任务中,但请确保第五个参数(用于并行执行)是
true
,并且设置了page async指令:

如果答案对您有帮助,请不要忘记接受答案,作为对他人的基本礼貌。。。