J'ai remarqué un autre point important à garder à l'esprit lors de l'écriture du code asynchrone/attendu dans le code-behind ASP.Net Web Forms, à savoir que Async = "true" dans la déclaration de page. Cet attribut est false par défaut.
Si vous ne le faites pas, vous pouvez voir votre page dans un état de chargement permanent.
<%@ Page Language="C#" Async="true" %>
également, en .Net 4.5, selon la réponse par Stephen nous devons avoir 'UseTaskFriendlySynchronizationContext' définie sur true dans la section AppSettings de configuration Web. Un autre appsetting utile est AllowAsyncDuringSyncStages qui doit être false pour le code async/await dans le code-behind Webforms. Ces paramètres sont tous les deux faux par défaut.
<add key="aspnet:AllowAsyncDuringSyncStages" value="false" />
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
J'ai eu l'exemple suivant async/code dans un attendent WebForm ASP.Net qui a couru très rapidement en utilisant les paramètres ci-dessus et en utilisant await tout le chemin à travers comme suggéré par Stephen. Si ces recommandations ne sont pas suivies, vous pouvez voir la page Webforms en cours de chargement dans le navigateur.
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' ne bloque pas en tant que telle ... mais oui: si il y a un ** appel ** code qui appelle '.Wait()' ou '.Result', ce sera un problème –