Для чего используется свойство “AsyncPattern” “OperationContractAttribute" + wcf?

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

  •  24-09-2019
  •  | 
  •  

Вопрос

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

  • Когда мне следует подумать AsyncPattern собственность?

Пример моих методов operationcontract,

[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;
        }
    }
Это было полезно?

Решение

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

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

Удачи вам!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top