Приложение на C# создает COM объект посредством interop и вызывает его функции.
Приложение предоставляющее COM интерфейс стороннее и в нем ничего не изменить.
На машине с одним процессором все работает как надо, но в двухъядерной
системе переодически возникает проблема при обращении к COM объекту и вылетает исключение:
System.Runtime.InteropServices.COMException' in ...
ErrorCode: HRESULT 0x8000FFFF
Message: "Ошибка входа в критическую секцию из-за потока 2900, функция "TListEx.Lock"
а иногда поток и вовсе зависает в неуправляемом коде. Никакие манипуляции с потоковыми
аппартаментами не помогают.
Единственная безумная идея это заставить оба приложения полностью выполняться на одном
и том же процессоре (включая все рабочие потоки приложений), но что для этого сделать
непридумаю никак, подскажите какие варианты есть или где читать ?
Здравствуйте, Американец, Вы писали:
SetProcessAffinityMask
Спасибо, заработало. Можно избавиться от SetProcessAffinityMask используя готовые обертки из фрейморка:
private void SetProcessToCPU(string processName)
{
IntPtr cpu = new IntPtr(1); // Номер(а) процессра(ов)
Process[] processes = Process.GetProcessesByName(processName);
foreach (Process p in processes)
p.ProcessorAffinity = cpu; // Всех с таким именем на один процессор, если есть права конечно
// Лучше конечно установить процессор только для рабочего потока а не для всего процесса приложения
Process.GetCurrentProcess().ProcessorAffinity = cpu;
}