C# PageAsyncTask时间是否与顺序进程相同?
为什么使用PageAsyncTask的以下ASP.NET代码在总共8秒的时间内执行,而不管我是按原样运行,还是使用PageAsyncTask和un comment Thread.Sleep(5000)在Page_load中注释2行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 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指令:如果答案对您有帮助,请不要忘记接受答案,作为对他人的基本礼貌。。。