2015-05-11 2 views
1

Мои знания об асинхронном поведении на C# немного ржавые, и мне интересно, может ли изменение какого-либо кода с помощью async будет полезным для нас или это может фактически снизить эффективность кода.Обертка Entity Framework Сохраненный код выполнения Proc в Задачи

У меня есть набор методов, каждый из которых выполняет хранимую процедуру через структуру сущности. Мы возвращаем IEnumerable<SomeDataType>.

Каждый метод в этой коллекции может работать независимо от других, и поэтому я должен думать о параллельном запуске их.

Что-то бывший коллега рассказал мне о том, что запросы БД выполняются синхронно, и обертывание кода вызова БД в Задачи, замедляющие систему, всплыло у меня в голове.

  • Могут ли быть преимущества для упаковки кода вызова БД в Задачи? или ...
  • Смогу ли я в конечном итоге замедлить нашу систему, обернув вызовы БД в Задачи?
  • Запросы БД выполняются синхронно?

Наши методы выглядят следующим образом:

private IEnumerable<Models.Permission> PermissionsForUser(Context entities,int userId) 
{ 
    var userperms = entities.sssp_GetUserPermissions(userId); 
    return ... 
} 

ответ

2

Может ли быть преимущества упаковки DB код вызова в задачах?

Это зависит. Если по Task вы имеете в виду «использование естественно асинхронного API, предоставляемого поставщиком данных», например, XXXAsync, выставленный ADO.NET или Entity Framework, тогда может выгода, если у вас есть одновременные запросы, попавшие в вашу базу данных, и вы хотите освободить свою потоки для обработки других запросов. Это, безусловно, не будет ускорить ваши запросы.

Будет ли я в конечном итоге замедлять нашу систему, обертывая вызовы БД в Задачи?

Опять же, это зависит. То же самое касается вашего первого вопроса и того, что вы подразумеваете под «Задачами». Вы должны помнить, что Task != Thread. Если вы хотите обернуть свой запрос в базу данных вызовом Task.Run, вы эффективно используете анти-шаблон "async over sync". Это может привести к замедлению ваших запросов, и вам придется ориентироваться, чтобы быть уверенными.

Запросы БД выполняются синхронно?

Запросы базы данных могут выполняться синхронно или асинхронно в зависимости от API, предоставляемого поставщиком. Выполнение вызовов базы данных естественно асинхронно, а это означает, что для этих запросов нет необходимости использовать какие-либо дополнительные потоки, чтобы освободить используемый поток. Если у вас есть несколько запросов, которые могут выполняться одновременно, вам может быть полезно воспользоваться этим API-интерфейсом asynchorouns.

0

Задача параллельной библиотеки не замедлит код, библиотека ввести в .net для воспользовавшись многоядерных процессоров существуют сегодня.

Итак, если вы запускаете два запроса в базу данных, оба они не зависят друг от друга, чем вы можете создать две задачи и сделать вызов в базу данных, которая будет выполнять ваш код параллельно.

По умолчанию работает задача использовать ThreadPool, если вы создать длительные задачи замедлить вещи, как вызов к базе данных может быть долго выполняющейся задачи я предлагаю вам сделать длительные задания с помощью TaskCreationOptions.LongRunning

Пример кода как:

Task[] tasks = new Task[2]; 

task[0] = Task.Factory.StartNew(calltodatabase1 
         , TaskCreationOptions.LongRunning 
         , cancellationTokenSource.Token); 
task[1] = Task.Factory.StartNew(calltodatabase2 
         , TaskCreationOptions.LongRunning 
         , cancellationTokenSource.Token); 

Task.WaitAll(tasks); 
Смежные вопросы