Если у вас нет крэша на следующей строке - значит экземпляр создается и значение переменной присваивается (если конечно вы не обурнули все в try {} catch (Exception) {}). В какой момент в дебаггере значение null? Где стоит брэйкпоинт? Возможно кто-то очищает эти поля к тому моменту, как у вас срабатывает брэйкпоинт.
Посмотрите время жизни объектов, какие объекты чаще создаются и уничтожаются сборщиком мусора. Возможно, их создание/удаление в куче можно оптимизировать.
Алексей: GCHandle.Alloc принимает это значение вторым параметром, если нужно закрепить объект в памяти.
Но эту технику нужно использовать только для взаимодействия с неуправляемым кодом, которому нужен постоянный адрес объекта в памяти. Т.к. при ее использовании возникает фрагментация памяти. Подробнее можно почитать в книге Under the hood of .NET memory management (доступна бесплатно)
А с какой целью нужно ее закрепить? Какую задачу вы хотите этим решить? Единственная причина, которая мне приходит на ум, это взаимодействие с неуправляемым кодом. Это ваш случай?
https://msdn.microsoft.com/en-us/library/ty0d8k56%... - ждет пока первый процесс не завершится