Для чего используется свойство "AsyncPattern" в OperationContractAttribute + wcf? - PullRequest
1 голос
/ 04 марта 2010

Таким образом, для используемых сервисов wcf с поддержкой ajax для получения записей из БД и отображения их в клиенте без использования свойства AsyncPattern OperationContractAttribute ....

  • Когда я должен рассмотреть AsyncPattern собственность?

Пример моих методов работы с контрактом,

[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;
        }
    }

1 Ответ

1 голос
/ 08 марта 2010

AsyncPattern имеет несколько применений - это в основном оптимизация производительности сервера, которая позволяет освободить потоки запросов рабочего пула на блокирующие операции. Например, когда происходит длительная операция блокировки, такая как доступ к БД, если вы используете API асинхронной БД на сервере с AsyncPattern, рабочий поток может вернуться в пул и обслуживать другие запросы. Исходный запрос «пробуждается» позже в другом рабочем потоке, когда доступ к БД завершен, и остальная часть работы выполнена (клиент службы просто терпеливо ждет - все это прозрачно, если вы не используете клиент с поддержкой AsyncPattern и обязательна). Это МОЖЕТ позволить вашему сервису обрабатывать больше запросов, если все сделано аккуратно. Чтобы воспользоваться этим преимуществом, вы должны использовать API на сервере, которые имеют собственные асинхронные реализации. Единственное, что я вижу, что может быть кандидатом, это вызов БД, который происходит в вашем методе SQLHelper.ExecuteDataset - вам нужно прочитать базовый API, чтобы убедиться, что доступна ИСТИННАЯ асинхронная опция (наличие методов BeginXXX / EndXXX не обязательно означает, что это TRUE async impl). Материал System.SqlClient действительно асинхронный.

Слово предостережения: вам придется обрабатывать много запросов, чтобы сделать это стоящим - для того, чтобы разделить вещи таким образом, нужно значительно усложнить сложность кода и читабельность. Вы также должны очень хорошо понимать многопоточное программирование - существуют многочисленные подводные камни, связанные с блокировкой, обработкой ошибок и т. Д., Которые выходят далеко за рамки SO.

Удачи!

...