[英]Asp.net long running process using asynch page
我有一個報告需要大約2到3分鍾才能提取所有數據
所以我試圖使用ASP.net Asynch頁面來防止超時。 但無法正常工作
這是我在做什么:
private delegate List<PublishedPagesDataItem> AsyncReportDataDelegate();
private AsyncReportDataDelegate longRunningMethod;
private List<PublishedPagesDataItem> reportData;
public PublishedPagesReport() // this is the constructor
{
reportData = new List<PublishedPagesDataItem>();
longRunningMethod = GetReportData;
}
protected void Page_Load(object sender, EventArgs e)
{
this.PreRenderComplete +=
new EventHandler(Page_PreRenderComplete);
AddOnPreRenderCompleteAsync(
new BeginEventHandler(BeginAsynchOperation),
new EndEventHandler(EndAsynchOperation)
);
}
private List<PublishedPagesDataItem> GetReportData()
{
// this is a long running method
}
private IAsyncResult BeginAsynchOperation(object sender, EventArgs e, AsyncCallback cb, object extradata)
{
return longRunningMethod.BeginInvoke(cb, extradata);
}
private void EndAsynchOperation(IAsyncResult ar)
{
reportData = longRunningMethod.EndInvoke(ar);
}
private void Page_PreRenderComplete(object sender, EventArgs e)
{
reportGridView.DataSource = reportData;
reportGridView.DataBind();
}
所以我有一個代表長期運行方法(GetReportData)的委托。
我試圖按照這篇文章來稱呼它:
http://msdn.microsoft.com/zh-CN/magazine/cc163725.aspx
長時間運行的方法確實在調試器中完成,但是EndAsynchOperation和Page_PreRenderComplete方法上的斷點永遠不會被擊中
知道我在做什么錯嗎?
下面的代碼有效。 不知道有什么區別,除了有一個if (!IsPostBack)
無論如何,現在解決了
private delegate List<PublishedPagesDataItem> AsyncReportDataDelegate();
private AsyncReportDataDelegate longRunningMethod;
private List<PublishedPagesDataItem> reportData;
public asynchtest()
{
reportData = new List<PublishedPagesDataItem>();
longRunningMethod = GetReportData;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Hook PreRenderComplete event for data binding
this.PreRenderComplete +=
new EventHandler(Page_PreRenderComplete);
// Register async methods
AddOnPreRenderCompleteAsync(
new BeginEventHandler(BeginAsyncOperation),
new EndEventHandler(EndAsyncOperation)
);
}
}
IAsyncResult BeginAsyncOperation(object sender, EventArgs e,
AsyncCallback cb, object state)
{
return longRunningMethod.BeginInvoke(cb, state);
}
void EndAsyncOperation(IAsyncResult ar)
{
reportData = longRunningMethod.EndInvoke(ar);
}
protected void Page_PreRenderComplete(object sender, EventArgs e)
{
Output.DataSource = reportData;
Output.DataBind();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.