Я сейчас пытаюсь сильно оптимизировать время выполнения программы и наткнулся на следующую проблему:
Проблема
В какой-то момент мне нужно позвонить EnumWindows
из user32.dll
(см. Документы Microsoft ) определение выглядит следующим образом:
internal static class NativeMethods
{
public delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumWindows(EnumWindowsProc enumFunc, IntPtr lParam);
//...
}
Как видите, я передаю делегату что-то сделать с каждым окном.
Я называю этот метод следующим образом:
NativeMethods.EnumWindows(GetVisibleWindowDelegate, IntPtr.Zero);
с
private bool GetVisibleWindowDelegate(IntPtr windowHandle, int _)
Примечание: я не использую параметр int
в делегате, то есть имя.
Это работает просто отлично. Теперь для оптимизации: мне нужно получить доступ и сохранить несколько динамических c списков типов List<IntPtr>
и IDictionary<int, Rectangle>
, обернутых в объект с именем RuntimeInformation
, для нескольких методов в различных классах.
Копирование значений и обратно из этого объекта RuntimeInformation использует драгоценное время выполнения около 20 мс на моем оборудовании для каждого вызова метода. Вот почему я хочу вместо этого передать этот объект по ссылке, но мне не удается получить ссылку в мой GetVisibleWindowDelegate
.
Подход
Я не могу изменить делегата -типа, потому что я не могу контролировать его.
Если я попытаюсь вызвать EnumWindows
следующим образом:
NativeMethods.EnumWindows(
(windowHandle, _) => GetVisibleWindowDelegate(windowHandle, ref runtimeInformation),
IntPtr.Zero
);
Я получу ошибку
Error CS1628 Cannot use ref, out, or in parameter 'runtimeInformation' inside an anonymous method, lambda expression, query expression, or local function
Насколько мне известно, свойства класса для ссылок не существует.
Вопрос
Как получить ссылку на мой RuntimeInformation
в функции, которую я использую в качестве делегата? Есть ли альтернативы этому подходу?
Решение должно иметь высокую производительность (первый приоритет) и быть поддерживаемым.