我注意到在ASP.Net Web Forms代码隐藏中编写async/await代码时要记住的另一个重点,那就是在页面声明中确保Async =“true”。该属性默认为false。
如果你不这样做,那么你可以看到你的网页处于永久加载状态。
<%@ Page Language="C#" Async="true" %>
此外,在.NET 4.5,根据斯蒂芬的答案,我们需要有“UseTaskFriendlySynchronizationContext”在web配置appSettings部分设置为true。另一个有用的应用程序是AllowAsyncDuringSyncStages对于Webforms代码隐藏中的异步/等待代码,它需要为false。这些设置默认都是假的。
<add key="aspnet:AllowAsyncDuringSyncStages" value="false" />
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
我有下面的示例异步/在一个ASP.Net Web窗体跑很快使用上述的设置和使用的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;
}
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html – Andomar
@Andomar'await'不会阻止这样......不过是:如果有一些**调用**代码,调用'.Wait()'或'.Result',这将是一个问题 –