. «Чистая» сборки может удалить «мертвую древесину», которая может быть оставлена лежащей рядом с предыдущими сборками, неудачными сборками, неполными сборками и другими проблемами сборки.
В общем случае среда IDE или сборка будет включать в себя некоторую форму «чистой» функции, но это может быть неправильно настроено (например, в ручном файле) или может завершиться неудачей (например, промежуточные или результирующие двоичные файлы - только).
После завершения «очистки» убедитесь, что «чистый» преуспел, и весь сгенерированный промежуточный файл (например, автоматический файл makefile) был успешно удален.
Этот процесс можно рассматривать как конечный вариант, но часто является хорошим первым шагом ; особенно если недавно был добавлен код, связанный с ошибкой (локально или из исходного репозитория).
Вот скриншот анализатора параллелизма, который я использовал, чтобы посмотреть, что происходит с этими потоками:
[/g0]
Да, вы можете видеть лоты красного (блокировка) с зелеными пятнами (исполнение). Потоки по очереди вводят критический раздел, который получен внутри внутренней функции GpGraphics :: RenderDrawPath (). Большие капли зеленого цвета - это то место, где программа действительно рисовала линии (я заменил DrawEllipse на DrawRectangle и избавился от случайного вызова).
Существует несколько параллелизм, вы можете, например, увидеть вызов RenderDrawPath () перекрывая код, который отображает сглаженные линии, общая загрузка процессора составляет около 35%. Но этого мало.
Конечно, вы ничего не можете с этим поделать. Вы опережаете, перекрывая логику в своей собственной программе, чтобы решить, что делать с помощью вызовов GDI +. Обычно это происходит, тест слишком синтетический.
Кажется, что блокировка происходит в неуправляемом коде внутри библиотеки GDI + (к сожалению, это поведение не упоминается в официальных документах).
Аналогичный вопрос: Параллелирование GDI + изменение размера .net
Я не уверен на 100%. Но да, в классе Graphics
есть объект блокировки private static
. Кажется, что он заблокирован только от GetHalftonePalette
, который, в свою очередь, вызывается всякий раз, когда Bitmap
инициализируется внутри объекта Graphics
. Похоже, что это может быть причиной споров.
(Примечание: первые результаты после 5 минут использования ILSpy .. не очень углублены)