我注意到在 ASP.Net Web Forms 代码隐藏中编写异步/等待代码时要记住的另一个重要点,那就是确保页面声明中的 Async="true"。此属性默认为 false。
如果您不这样做,那么您可能会看到您的页面处于永久加载状态。
<%@ Page Language="C#" Async="true" %>
此外,在 .Net 4.5 中,根据 Stephen 的回答,我们需要在 web config appsettings 部分将“UseTaskFriendlySynchronizationContext”设置为 true。另一个有用的应用设置是AllowAsyncDuringSyncStages ,对于 Webforms代码隐藏中的异步/等待代码,它需要为 false。默认情况下,这些设置都是错误的。
<add key="aspnet:AllowAsyncDuringSyncStages" value="false" />
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
我在 ASP.Net WebForm 中有以下示例 async/await 代码,该代码使用上述设置运行得非常快,并按照 Stephen 的建议一直使用 await。如果不遵循这些建议,那么您可能会在浏览器中看到 Webforms 页面永远加载。
protected async void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string sql = @"DELETE FROM dbo.Table1
WHERE Processed = 1";
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MainDB"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
int numberOfRecordsUpdated = await UpdateDatabaseAsync(conn, cmd);
}
}
public async Task<int> UpdateDatabaseAsync(SqlConnection conn, SqlCommand cmd)
{
int i = 0;
try
{
await conn.OpenAsync();
i = await cmd.ExecuteNonQueryAsync();
}
catch (Exception ex)
{
//log the error
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
finally
{
if (conn != null)
{
conn.Close();
conn.Dispose();
}
if (cmd != null)
{
cmd.Dispose();
}
}
return i;
}