我必须支持一个使用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();
}
}
问题
回应永远不会结束。我只看到了:
我错过了什么?
(nb Async="true"
在页面指令上,同样 - 代码被简化以描述案例)
答案 0 :(得分:1)
我认为这里的问题是您将同一BeginGetData
和EndGetData
个回调传递给BeginExecuteReader
和new PageAsyncTask()
。它们应该是不同的:你传递给PageAsyncTask
的是"外部"你传递给BeginExecuteReader
的内容。
您要从BeginExecuteReader
开始回拨中致电PageAsyncTask
,实际上您需要拨打提供给AsyncCallback callback
的{{1}}你在那里通过ASP.NET(当异步操作完成时,你将调用它,即来自你的EndGetData
)。
如果您可以使用PageAsyncTask(Func<Task>)
覆盖,那会更容易,但我认为您不能使用VS2010来定位.NET 4.5。