Для чего используется свойство “AsyncPattern” “OperationContractAttribute" + wcf?
-
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.
Удачи вам!