我注意到在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',這將是一個問題 –