다른 종류의 작업을 수행하기 위해 다른 스레드를 실행하는 Windows Forms 응용 프로그램이 있습니다. 때때로 모든 스레드 (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);
}
}
감사합니다!
동결이란 영구적으로 반응이 없거나 응답이없는 기간입니까? 몇 개의 스레드 및 어떤 종류의 잠금 및/또는 동기화 메커니즘을 사용하고 있습니까? –
교착 상태가 발생했는지 궁금합니다. 그것을 시뮬레이트하기 위해, 아마도 무한 루프 (또는 긴 수면)를 중요한 섹션에 넣고, 한 스레드 (어쩌면 관리되지 않는 루프)에서 입력 한 다음 다른 모든 스레드로부터 입력하려고 시도 할 수 있습니다. 블록? –