Asp.net длительный процесс с использованием асинхронной страницы - PullRequest
0 голосов
/ 23 июня 2010

У меня есть отчет, который занимает около 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();
}

Итак, у меня есть делегат, представляющий метод Long running (GetReportData).

ИЯ пытаюсь вызвать его в соответствии с этой статьей:

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

Длительный метод завершается в отладчике, но точки останова в методах EndAsynchOperation и Page_PreRenderComplete никогда не получают удар

есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 23 июня 2010

код ниже работает.не уверен, в чем разница, за исключением того, что есть 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();
}
...