64 votes

Quelle est la signification de "UseTaskFriendlySynchronizationContext" ?

Il y a un nouveau paramètre d'application dans asp.net 4.5.

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

un code comme celui-ci peut fonctionner en asp.net 4.0

protected void Button1_Click(object sender, EventArgs e)
{
    CallAysnc();
}

public void CallAysnc()
{
    AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid().ToString());

    WebClient client = new WebClient();
    client.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) =>
    {
        asyncOp.PostOperationCompleted(CallCompleted, e.Result);
    };
    client.DownloadStringAsync(new Uri("http://www.google.com"));
}

private void CallCompleted(object args)
{
    Response.Write(args.ToString());
}

Mais cela ne fonctionne pas dans asp.net 4.5, et quand je supprime le nouvel appsetting, cela fonctionne à nouveau !

Quelle est la signification de "UseTaskFriendlySynchronizationContext" ?

71voto

Michael Points 1971

Concernant UseTaskFriendlySynchronizationContext , de Forums Microsoft :

Cela indique à ASP.NET d'utiliser un pipeline asynchrone entièrement nouveau qui suit les conventions du CLR pour lancer des opérations asynchrones, y compris le retour des threads dans le ThreadPool si nécessaire. ASP.NET 4.0 et inférieurs suivaient leurs propres conventions qui allaient à l'encontre des directives du CLR, et si le commutateur n'est pas activé, c'est très Il est facile pour les méthodes asynchrones de s'exécuter de manière synchrone, de bloquer la demande ou de ne pas se comporter comme prévu.

Aussi, je pense AsyncOperationManager est destiné aux applications de bureau. Pour les applications ASP.NET, vous devriez utiliser RegisterAsyncTask et la mise en place <%@ Page Async="true" , voir ici pour plus de détails .

Ainsi, en utilisant les nouveaux mots-clés c#, votre exemple serait :

protected void Button1_Click(object sender, EventArgs e)
{
    RegisterAsyncTask(new PageAsyncTask(CallAysnc));
}

private async Task CallAysnc()
{
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com");
    Response.Write(res);
}

L'objectif est de prendre en charge les éléments suivants d'ici la sortie de la version, mais ils ne sont pas actuellement pris en charge dans la version bêta :

protected async void Button1_Click(object sender, EventArgs e)
{
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com");
    Response.Write(res);
}

11voto

urig Points 2707

Plus de détails, cités dans ASP.NET 4.5.1 documentation pour appSettings sur MSDN :

aspnet:UseTaskFriendlySynchronisationContext

Spécifie le comportement des chemins de code asynchrones dans ASP.NET 4.5.

...

Si la valeur de cette clé est false [par défaut], les chemins de code asynchrones dans ASP.NET 4.5 se comportent comme ils le faisaient dans ASP.NET 4.0. Si la valeur de cette clé valeur de cette clé est définie sur true, ASP.NET 4.5 utilise des chemins de code qui sont optimisés pour les API retournant des tâches. La définition de ce commutateur de compatibilité est obligatoire pour les applications compatibles WebSockets, pour l'utilisation de l'asynchronisme dans les pages de formulaires Web et pour certains autres comportements asynchrones. asynchrones.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X