异步执行返回页面内容 AddOnPreRenderCompleteAsync
来源:互联网 发布:mac自带预览抠图 编辑:程序博客网 时间:2024/06/05 17:03
aspx: Async="true"
<%@ Page Language="C#" Async="true" AutoEventWireup="true" CodeFile="AsynCall.aspx.cs" Inherits="AsynCall" %>
cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
public partial class AsynCall : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 准备回调数据,它将由AddOnPreRenderCompleteAsync的第三个参数被传入。
AsyncDemo handler = new AsyncDemo("test1");
// 注册一个异步任务。注意这三个参数哦。
AddOnPreRenderCompleteAsync(BeginCall, EndCall, handler);
}
private IAsyncResult BeginCall(object sender, EventArgs e, AsyncCallback cb, object extraData)
{
// 在这个方法中,
// sender 就是 this
// e 就是 EventArgs.Empty
// cb 就是 EndCall
// extraData 就是调用AddOnPreRenderCompleteAsync的第三个参数
AsyncDemo handler = (AsyncDemo)extraData;
// 开始一个异步调用。页面线程也最终在执行这个调用后返回线程池了。
// 如果网络调用完成,则会调用 cb 对应的回调委托,其实就是下面的方法
IAsyncResult ret = handler.BeginRun(cb, handler);
return ret;
}
private void EndCall(IAsyncResult ar)
{
// 到这个方法中,表示一个任务执行完毕。
// 参数 ar 就是BeginCall的返回值。
Trace.Write("EndCall ThreadId = " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
AsyncDemo handler = (AsyncDemo)ar.AsyncState;
try
{
Response.Write("success: " + handler.EndRun(ar));
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
public class AsyncDemo
{
// Use in asynchronous methods
private delegate string runDelegate();
private string m_Name;
private runDelegate m_Delegate;
public AsyncDemo(string name)
{
m_Name = name;
m_Delegate = new runDelegate(Run);
}
/**/
/// <summary>
/// Synchronous method
/// </summary>
/// <returns></returns>
public string Run()
{
Thread.Sleep(3 * 1000);
return "My name is " + m_Name;
}
/**/
/// <summary>
/// Asynchronous begin method
/// </summary>
/// <param name="callBack"></param>
/// <param name="stateObject"></param>
/// <returns></returns>
public IAsyncResult BeginRun(
AsyncCallback callBack, Object stateObject)
{
try
{
return m_Delegate.BeginInvoke(callBack, stateObject);
}
catch (Exception e)
{
// Hide inside method invoking stack
throw e;
}
}
/**/
/// <summary>
/// Asynchronous end method
/// </summary>
/// <param name="ar"></param>
/// <returns></returns>
public string EndRun(IAsyncResult ar)
{
if (ar == null)
throw new NullReferenceException(
"Arggument ar can't be null");
try
{
return m_Delegate.EndInvoke(ar);
}
catch (Exception e)
{
// Hide inside method invoking stack
throw e;
}
}
}
<%@ Page Language="C#" Async="true" AutoEventWireup="true" CodeFile="AsynCall.aspx.cs" Inherits="AsynCall" %>
cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
public partial class AsynCall : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 准备回调数据,它将由AddOnPreRenderCompleteAsync的第三个参数被传入。
AsyncDemo handler = new AsyncDemo("test1");
// 注册一个异步任务。注意这三个参数哦。
AddOnPreRenderCompleteAsync(BeginCall, EndCall, handler);
}
private IAsyncResult BeginCall(object sender, EventArgs e, AsyncCallback cb, object extraData)
{
// 在这个方法中,
// sender 就是 this
// e 就是 EventArgs.Empty
// cb 就是 EndCall
// extraData 就是调用AddOnPreRenderCompleteAsync的第三个参数
AsyncDemo handler = (AsyncDemo)extraData;
// 开始一个异步调用。页面线程也最终在执行这个调用后返回线程池了。
// 如果网络调用完成,则会调用 cb 对应的回调委托,其实就是下面的方法
IAsyncResult ret = handler.BeginRun(cb, handler);
return ret;
}
private void EndCall(IAsyncResult ar)
{
// 到这个方法中,表示一个任务执行完毕。
// 参数 ar 就是BeginCall的返回值。
Trace.Write("EndCall ThreadId = " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
AsyncDemo handler = (AsyncDemo)ar.AsyncState;
try
{
Response.Write("success: " + handler.EndRun(ar));
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
public class AsyncDemo
{
// Use in asynchronous methods
private delegate string runDelegate();
private string m_Name;
private runDelegate m_Delegate;
public AsyncDemo(string name)
{
m_Name = name;
m_Delegate = new runDelegate(Run);
}
/**/
/// <summary>
/// Synchronous method
/// </summary>
/// <returns></returns>
public string Run()
{
Thread.Sleep(3 * 1000);
return "My name is " + m_Name;
}
/**/
/// <summary>
/// Asynchronous begin method
/// </summary>
/// <param name="callBack"></param>
/// <param name="stateObject"></param>
/// <returns></returns>
public IAsyncResult BeginRun(
AsyncCallback callBack, Object stateObject)
{
try
{
return m_Delegate.BeginInvoke(callBack, stateObject);
}
catch (Exception e)
{
// Hide inside method invoking stack
throw e;
}
}
/**/
/// <summary>
/// Asynchronous end method
/// </summary>
/// <param name="ar"></param>
/// <returns></returns>
public string EndRun(IAsyncResult ar)
{
if (ar == null)
throw new NullReferenceException(
"Arggument ar can't be null");
try
{
return m_Delegate.EndInvoke(ar);
}
catch (Exception e)
{
// Hide inside method invoking stack
throw e;
}
}
}
}
同一个session是单线程运行的run函数
不同session,run是可以多线程执行的。
就效率而言和直接在aspx同步做,没多少区别。
要高效,还是用ManualResetEvent高些,访问aspx的时候,创建event,wait,别的线程处理完数据,事件通知完成,并返回结果到缓存里面。
http协议对于及时通讯效率肯定低,websocket协议要高效些,类似tcp了。
0 0
- 异步执行返回页面内容 AddOnPreRenderCompleteAsync
- 页面局部异步执行
- java 异步执行任务,返回进度
- ajax异步执行回调函数内容
- Windows Store App异步返回刷新页面
- javascript调用ajax页面返回指定内容
- ajax返回javascript给页面执行
- ajax返回javascript给页面执行
- ajax返回javascript给页面执行
- Html页面内容的执行顺序
- spring mvc中返回ModelAndView后执行ajax异步请求
- ajax异步调用直接返回页面,并显示
- python脚本中获得执行终端命令返回的内容
- 异步执行数据处理,不阻挡页面的显示
- ajax上传excel后读出内容并无刷新返回页面
- servlet中使用HttpServletResponseWrapper截获返回的页面内容
- Spring3.2 MVC框架页面跳转及返回JSON内容
- J2EE 通过Filter替换返回页面的内容
- 读入一行字符(包括空格)做为一个字符串的两个方法 ,C/C++
- MySQL获取自增ID的方法
- 如何利用socket进行HTTP访问
- windows下同一进程创建多份http的session方法
- C# 获取当前路径方法
- 异步执行返回页面内容 AddOnPreRenderCompleteAsync
- abap内表
- 中文检索(分词、同义词、权重)
- 如何正确理解ABBYY FineReader中的模式和语言
- socket发送方发送速率过快问题
- 代理模式
- 打开本地html
- Cool Edit Pro 2.0 Resample.xfm
- EditPlus 编写运行 Groovy