2013-06-14 4 views
0

Я знаю, что это плохо для производительности моего приложения, чтобы создать слишком много потоков (threadstarvation), но я не уверен, как это переводится в функциональные возможности Async/Await. Я понимаю, что Task.Run() использует ThreadPool для выполнения своего кода. Также я прочитал, что он не создает новый поток.Является ли это разумным, чтобы перерисовать CPU через Task.Run

Теперь у меня есть 3 очка, я coudln't найти ответ на:

  1. мне нужно, чтобы убедиться, что не многие нитей вокруг вручную или будет, что будет управляться .Net Do -Фреймворк?

  2. Может ли этот код привести к резьбовому соединению?

    Dim ltsk As List(Of Task) 
    For Each pers As Person In ListPerson 'Potentialy big Collection of Objects 
        ltsk.Add(Task.Run(Sub() pers.CheckPerson)) 'Long running function with own Task.Run() inside 
    Next 
    Task.WhenAll(ltsk) 
    
  3. Создает ли это нить или нет?

    Dim i As Integer = 0 
    Task.Run(Sub() i += 1) 'I know its an insane example 
    

Я использую код похож на то, что я спрашиваю (2.) в моем новом приложении и получить загрузку процессора более чем на 90%. Обычно, когда я получаю это высоко, я сделал что-то неправильно.

ответ

6

Параллельная библиотека задач (из которых Task - часть) имеет несколько эвристик для предотвращения голодания CPU. Кроме того, Windows использует динамические приоритеты, что означает, что если вы используете потоки пулов потоков для работы ЦП, они будут автоматически выполняться с меньшим приоритетом.

1. Нужно ли мне проверять, не существует ли много потоков вокруг вручную или будет управляться .Net-Framework?

Это управление каркасом.

2. Может ли этот код привести к возникновению резьбы?

No.

3. Есть ли создать эту нить или нет?

Он будет помещать рабочий элемент в пул потоков. Если пул потоков имеет больше работы, чем он может сделать, он может решить создать другой поток.


Если вы делаете фактическую параллельную обработку (CPU-интенсивная работа), то вам следует рассмотреть возможность использования Parallel или Parallel LINQ вместо Task непосредственно.

+0

Благодарим вас за это разъяснение. В чем же преимущество использования 'Parallel' вместо того, чтобы самостоятельно обрабатывать« Задачу »? – Patrick

+0

'Parallel' (и Parallel LINQ) имеют много конструкций более высокого уровня для таких вещей, как« выполнить эту операцию на этой последовательности входов »,« суммировать результаты »и т. Д. С помощью« Задачи »вам придется делать все это рукой. например, 'Parallel.ForEach (ListPerson, pers => pers.CheckPerson())'. Параллельные и параллельные LINQ используют «разделение», чтобы сделать параллельный код более эффективным. –

Смежные вопросы