У меня есть приложение Windows Forms, которое само запускает разные потоки для выполнения разных видов работы. Иногда ВСЕ потоки (включая поток пользовательского интерфейса) зависают, и мое приложение перестает отвечать на запросы. Я решил, что это может быть проблема, связанная с сборщиком мусора, поскольку сборщик мусора временно заморозит все управляемые потоки. Чтобы убедиться, что только что управляемые потоки заморожены, я запускаю неуправляемый поток, который каждую секунду пишет в файл «heartbeat» с меткой времени, и на него это не влияет (т.е. он все еще выполняется):
public delegate void ThreadProc();
[DllImport("UnmanagedTest.dll", EntryPoint = "MyUnmanagedFunction")]
public static extern void MyUnmanagedFunction();
[DllImport("kernel32")]
public static extern IntPtr CreateThread(
IntPtr lpThreadAttributes,
uint dwStackSize,
IntPtr lpStartAddress,
IntPtr lpParameter,
uint dwCreationFlags,
out uint dwThreadId);
uint threadId;
ThreadProc proc = new ThreadProc(MyUnmanagedFunction);
IntPtr functionPointer = Marshal.GetFunctionPointerForDelegate(proc);
IntPtr threadHandle = CreateThread(IntPtr.Zero, 0, functionPointer, IntPtr.Zero, 0, out threadId);
Мой вопрос: как мне смоделировать эту ситуацию, когда все управляемые потоки приостановлены, но неуправляемые продолжают вращаться?
Мой первый удар :
private void button1_Click(object sender, EventArgs e) {
Thread t = new Thread(new ThreadStart(delegate {
new Hanger();
GC.Collect(2, GCCollectionMode.Forced);
}));
t.Start();
}
class Hanger{
private int[] m_Integers = new int[10000000];
public Hanger() { }
~Hanger() { Console.WriteLine("About to hang...");
//This doesn't reproduce the desired behavior
//while (true) ;
//Neither does this
//Thread.Sleep(System.Threading.Timeout.Infinite);
}
}
Заранее спасибо !!