public void TryThreeTimes(Action action)
{
var tries = 3;
while (true) {
try {
action();
break; // success!
} catch {
if (--tries == 0)
throw;
Thread.Sleep(1000);
}
}
}
Тогда вы бы позвонили:
TryThreeTimes(DoSomething);
... или, альтернативно ...
TryThreeTimes(() => DoSomethingElse(withLocalVariable));
Более гибкий вариант:
public void DoWithRetry(Action action, TimeSpan sleepPeriod, int tryCount = 3)
{
if (tryCount <= 0)
throw new ArgumentOutOfRangeException(nameof(tryCount));
while (true) {
try {
action();
break; // success!
} catch {
if (--tryCount == 0)
throw;
Thread.Sleep(sleepPeriod);
}
}
}
Для использования в качестве:
DoWithRetry(DoSomething, TimeSpan.FromSeconds(2), tryCount: 10);
Более современная версия с поддержкой async / await :
public async Task DoWithRetryAsync(Func<Task> action, TimeSpan sleepPeriod, int tryCount = 3)
{
if (tryCount <= 0)
throw new ArgumentOutOfRangeException(nameof(tryCount));
while (true) {
try {
await action();
return; // success!
} catch {
if (--tryCount == 0)
throw;
await Task.Delay(sleepPeriod);
}
}
}
Для использования в качестве:
await DoWithRetryAsync(DoSomethingAsync, TimeSpan.FromSeconds(2), tryCount: 10);
Многие функции GDI ускоряются с помощью графического оборудования, а некоторые подпрограммы GDI + могут использовать GDI ниже.Но большая часть GDI + не зависит от GDI.
Важным и показательным примером является визуализация текста. В GDI + отрисовка текста полностью выполняется программно; сглаживание, подгонка пикселей глифов и другие эффекты выполняются без видеокарты.
(источник: microsoft.com )
Крис Джексон из Microsoft опубликовал интересную запись в блоге, в которой описал разницу в скорости отрисовки текста в GDI и GDI + :
... мой кодовый путь GDI отображал примерно 99 000 глифов в секунду, тогда как мой кодовый путь GDI + отображал примерно 16 000 глифов в секунду.
Другой пример - рисование линий. GDI + поддерживает рисование линий / многоугольников и кругов / эллипсов со сглаживанием, тогда как GDI не поддерживает:
(источник: microsoft.com )
(источник: microsoft.com )
(источник: microsoft.com )
GDI + не является COM. GDI + имеет базовый «плоский» API, который вызывается из C (или, следовательно, из любого другого языка), и объектно-ориентированную оболочку на C ++, которая просто вызывает плоский API. В .NET (System.Drawing) и Delphi также есть оболочки, которые также просто вызывают плоский API. Он работает совершенно иначе, чем GDI, поскольку вы не устанавливаете объекты (перья, кисти, шрифты) в контекст устройства, а скорее передаете их функциям рисования. У него мало общего с GDI. Я не знаю, использует ли реализация GDI + GDI - но, скорее всего, нет, потому что у него так много функций, которые просто недоступны в GDI.
К сожалению, он медленнее, чем GDI. Тем не менее, он очень мощный.
Как тем временем заметил Декастельжау, проблемы с производительностью могут возникать из-за того, что он не обрабатывается аппаратно, в отличие от OpenVG или WPF. Недавно я использовал XNA для графического приложения реального времени.
GDI + построен на GDI и добавляет несколько дополнительных функций. Например, GDI + добавляет поддержку прозрачности, растяжения растрового изображения со сглаживанием и т. Д.
GDI + - это в основном объектный API, а GDI - это функция api. Большинство функций GDI + не оптимизированы аппаратно (они обрабатываются программным обеспечением), в отличие от GDI. Например, в GDI BitBlt обрабатывается напрямую аппаратно. Функции рисования растровых изображений GDI + нет.
GDI + - мощный API, но будьте осторожны с его производительностью.
GDI + доступен в C ++, COM и .NET