我有一個Windows窗體應用程序,它本身啓動不同的線程來做不同種類的工作。偶爾,所有線程(包括UI線程)都會凍結,並且我的應用程序變得無法響應。我已經決定它可能是一個垃圾收集器相關的問題,因爲GC將暫時凍結所有管理線程。要驗證勉強線程都將凍結,我旋轉起來的非託管一個寫一個「心跳」文件與時間戳每一秒,並且不影響(即它仍然運行):如何模擬此應用程序掛起方案?
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);
}
}
在此先感謝!
通過冷凍你是指永久無響應(掛起)或僅僅是一個無反應的時期? 多少個線程和什麼樣的鎖定和/或同步機制是您使用? – 2010-03-26 19:59:58
我想知道你是否有僵局。爲了模擬這一點,也許你可以嘗試在一個關鍵部分放一個無限循環(或者只是一個長時間的睡眠),從一個線程(也許是非託管的線程)輸入它,然後嘗試從所有其他線程輸入它,導致它們塊? – 2010-03-26 20:00:19