약간의 무거운 작업을 수행하는 작은 프로젝트를 마쳤습니다. 이 짧은 계산 시간에 깨달았습니다. GUI가 멈 춥니 다. 그래서 나는 약간의 연구를했고 이것을 발견했다.>>http://www.codeproject.com/Articles/4381/Threading-out-tasks-in-a-C-NET-GUI생성자를 사용하여 새 스레드를 시작하십시오.
나는 이것이 나의 프로젝트라는 것을 구현하기 시작했는데, 나는이 특별한 구현이 내 프로젝트에서 작동하지 않는다는 것을 깨달았다.
내 프로젝트에는 많은 클래스와 다른 모든 클래스를 제어하는 하나의 "관리자"가 있습니다. 이 Manager 클래스를 initilize하면 이미 생성자에서 무거운 것을 수행합니다. 내 질문에
:
은 어떻게 생성자에 새 스레드를 시작합니까?
private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
if (System.IO.File.Exists(e.FullPath) == true)
{
Manager mgr = new Manager(e, handreader); // here starts the heavy lifting
Thread mgrThread = new Thread(new ThreadStart(mgr)); // what to do ?
sl.Text = mgr.test();
txtLog.Text = mgr.output();
}
}
편집 : 난 내 프로그램을 코딩하기로 결정 괜찮습니다. 이제는 무거운 짐을 싣는 것이 하나의 기능이지만 실수를 저질렀다고 생각합니다.
private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
if (System.IO.File.Exists(e.FullPath) == true)
{
Manager mgr = new Manager(e, handreader, txtLog, sl);
//sl.Invoke(new MethodInvoker(mgr.test));
sl.Invoke(new MethodInvoker(mgr.test)); // first try
Thread mgrThread = new Thread(new ThreadStart(mgr.test)); // second try
}
}
sl.Invoke(new MethodInvoker(mgr.test)); // first try
일을하지만 여전히 내 GUI를 정지 :
전체 프로그램은 다음과 같습니다.
Thread mgrThread = new Thread(new ThreadStart(mgr.test)); // second try
이 줄은 아무 것도 수행하지 않습니다.
내 테스트 기능 :
public void test()
{
StringBuilder builder = new StringBuilder();
foreach (PlayerController pc in fm.lPc)
{
Range range = new Range(handReader.hand, handReader.handversus, pc);
builder.Append(pc.getHeroCardsSimple()+" vs 100% range = "+range.vsRange()+"\r\n");
}
sl.Text = builder.ToString();
}
주요 질문에 대한 답변이 있더라도 Jon과 동의합니다 : 생성자에서 과도한 작업을하지 마십시오! – ChrFin
물론 네,하지만 그건 다른 질문입니다. – Bas