响应永远不会以PageAsyncTask结束?

时间:2014-06-13 07:37:23

标签: c# asp.net .net-4.0 asynchronous pageasynctask

我必须支持一个使用PageAsyncTask和webforms vs2010 fw4的旧项目。

然而,这个简单的代码确实编译+执行(在调试模式/跟踪模式下没有错误),但响应永远不会结束。

查看调试模式+断点 - 它到达代码的所有阶段。

public partial class _Default2 : System.Web.UI.Page
{
 IAsyncResult BeginGetData(object sender, EventArgs e, AsyncCallback callback, object state)
    {
        SqlConnection con = new SqlConnection(@"Data Source=... Asynchronous Processing=True;");
        var sql = @"   SELECT   [NAME] FROM [WebERP].[dbo].[t]";
        {
            SqlCommand _cmd = null;
            try
            {
                _cmd = new SqlCommand(sql, con);
                _cmd.CommandTimeout = 100000;
                con.Open();
                return _cmd.BeginExecuteReader(EndGetData, _cmd);

            }
            catch (Exception ex)
            {
                if (_cmd != null) _cmd.Dispose();
                con.Close();
                throw;
            }
        }
    }

    void EndGetData(IAsyncResult ar)
    {
        (ar.AsyncState as SqlCommand).EndExecuteReader(ar);
        Response.Write(1111); // HttpContext.Current.Response also doesnt help
    }

    void TimeoutData(IAsyncResult ar)
    {
        Response.Write("Could not retrieve data!");
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        PageAsyncTask task = new PageAsyncTask(BeginGetData, EndGetData, TimeoutData, null, true);
        Page.RegisterAsyncTask(task);
        Page.ExecuteRegisteredAsyncTasks();    
    }
}

问题

回应永远不会结束。我只看到了:

enter image description here

我错过了什么?

(nb Async="true"在页面指令上,同样 - 代码被简化以描述案例)

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是您将同一BeginGetDataEndGetData个回调传递给BeginExecuteReadernew PageAsyncTask()。它们应该是不同的:你传递给PageAsyncTask的是"外部"你传递给BeginExecuteReader的内容。

您要从BeginExecuteReader开始回拨中致电PageAsyncTask,实际上您需要拨打提供给AsyncCallback callback的{​​{1}}你在那里通过ASP.NET(当异步操作完成时,你将调用它,即来自你的EndGetData)。

如果您可以使用PageAsyncTask(Func<Task>)覆盖,那会更容易,但我认为您不能使用VS2010来定位.NET 4.5。