¿Cuál es el uso de la propiedad "AsyncPattern" de "OperationContractAttribute" + wcf?

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

  •  24-09-2019
  •  | 
  •  

Pregunta

Por lo tanto, para los servicios wcf habilitados para ajax usados, obtener registros de la base de datos y mostrarlos en el cliente sin usar AsyncPattern propiedad de OperationContractAttribute....

  • ¿Cuándo debo considerar? AsyncPattern ¿propiedad?

Muestra de mis métodos de contrato de operación,

[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;
        }
    }
¿Fue útil?

Solución

AsyncPattern tiene algunos usos: es principalmente una optimización de rendimiento del servidor que le permite liberar subprocesos de solicitud de grupo de trabajadores en las operaciones de bloqueo. Por ejemplo, cuando se produce una operación de bloqueo de larga duración como el acceso a DB, si está utilizando una API de DB Async en el servidor con AsyncPattern, el hilo de trabajadores puede volver al grupo y atender otras solicitudes. La solicitud original se "despierta" más adelante en otro hilo de trabajador cuando el acceso DB se completa, y el resto del trabajo está realizado (el cliente de servicio solo espera, todo esto es transparente a menos que esté utilizando un cliente de AsyncPattern. y vinculante). Esto puede permitir que su servicio procese más solicitudes, si se realiza con cuidado. Para aprovechar, debe utilizar API en el servidor que tengan implementaciones de Async nativas. La única que veo que podría ser un candidato es la llamada de DB que está sucediendo en su sqlhelper. No significa necesariamente que sea una verdadera implicación de asíncrono). Las cosas de System.SqlClient son realmente asíncronas.

Una advertencia: debe procesar muchas solicitudes para que valga la pena: hay un costo significativo para codificar la complejidad y la legibilidad para dividir las cosas de esta manera. También debe comprender muy bien la programación de subprocesos múltiples, hay numerosas dificultades en torno al bloqueo, el manejo de errores, etc., que están fuera del alcance de una publicación SO.

¡Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top