Прежде всего: вы применяете подход C ++ к проблеме, которая решается по-другому в C #.В C # вы, как правило, не хотите делать что-либо с использованием явных указателей, потому что они усложняют жизнь, особенно в части, связанной с сборкой мусора.Кстати, вам нужно передать весь список (и, возможно, индекс) в качестве параметра вместе со смещением в другой поток.Вы также должны быть уверены, что заблокируете список соответствующим образом во всех обращающихся потоках, чтобы избежать грязных операций чтения / записи.
Правильное решение - просто передать элемент, который вы действительно хотитепроцесс.Ссылочные типы передаются по значению, но это просто означает, что новый указатель создается для той же переменной кучи.На самом деле это не создает новое значение в куче.
Так, например:
var myList = new List<MyClass> { someInstanceofMyClass1, someInstanceofMyClass2 };
var t = new Thread(()=> SomeMethod(myList[0])); // Assuming MyClass is a reference type, the value passed here is the same instance as the one in myList
t.Start();
...