Quelle est l'utilisation de la propriété «AsyncPattern» de «OperationContractAttribute» + WCF?

StackOverflow https://stackoverflow.com/questions/2377112

  •  24-09-2019
  •  | 
  •  

Question

Ainsi, pour les services WCF ont permis à AJAX d'obtenir des enregistrements de DB et de l'afficher dans le client sans utiliser AsyncPattern propriété de OperationContractAttribute....

  • Quand devrais-je considérer AsyncPattern propriété?

Échantillon de mes méthodes d'opération

[OperationContract]
 public string GetDesignationData()
    {
        DataSet dt = GetDesignationViewData();
        return GetJSONString(dt.Tables[0]);
    }
    public string GetJSONString(DataTable Dt)
    {
        string[] StrDc = new string[Dt.Columns.Count];
        string HeadStr = string.Empty;
        for (int i = 0; i < Dt.Columns.Count; i++)
        {
            StrDc[i] = Dt.Columns[i].Caption;
            HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
        }
        HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
        StringBuilder Sb = new StringBuilder();

        Sb.Append("{\"" + Dt.TableName + "\" : [");
        for (int i = 0; i < Dt.Rows.Count; i++)
        {
            string TempStr = HeadStr;
            Sb.Append("{");
            for (int j = 0; j < Dt.Columns.Count; j++)
            {
                if (Dt.Rows[i][j].ToString().Contains("'") == true)
                {
                    Dt.Rows[i][j] = Dt.Rows[i][j].ToString().Replace("'", "");
                }
                TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());
            }
            Sb.Append(TempStr + "},");
        }
        Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
        Sb.Append("]}");
        return Sb.ToString();
    }
    public DataSet GetDesignationViewData()
    {
        try
        {
            string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
            return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, DataTemplate.spDesignation_View);
        }
        catch (Exception err)
        {
            throw err;
        }
    }
Était-ce utile?

La solution

AsyncPattern a quelques utilisations - c'est principalement une optimisation des performances du serveur qui vous permet de libérer des threads de demande de pool de travailleurs sur les opérations de blocage. Par exemple, lorsqu'une opération de blocage de longue durée comme l'accès DB se produit, si vous utilisez une API ASync DB sur le serveur avec AsyncPattern, le thread de travailleur peut revenir au pool et servir d'autres demandes. La demande d'origine est "éveillée" plus tard sur un autre thread de travailleur lorsque l'accès à la base de données se termine, et le reste du travail est terminé (le client de service attend simplement patiemment - tout cela est transparent à moins que vous n'utilisiez un client Asyncpattern-Aware et reliure). Cela peut permettre à votre service de traiter plus de demandes, si cela est fait avec soin. Pour en profiter, vous devez utiliser des API sur le serveur qui ont des implémentations asynchrones natives. Le seul que je vois qui pourrait être un candidat est l'appel de base de données qui se passe dans votre méthode sqlhelper.executedataset - vous devez lire sur l'API sous-jacent pour vous assurer qu'une véritable option asynchrone est disponible (présence de méthodes débutXxx / ENDxxx Cela ne signifie pas nécessairement que c'est un véritable implat asynchrone). Les trucs System.SqlClient sont vraiment asynchrones.

Un mot d'avertissement: vous devez traiter de nombreuses demandes pour en faire la peine - il y a un coût important pour la complexité du code et la lisibilité à diviser les choses de cette façon. Vous devez également comprendre la programmation multi-thread très bien, il existe de nombreux pièges autour du verrouillage, de la manipulation des erreurs, etc., qui sont bien en dehors de la portée d'un post SO.

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top