【发布时间】:2012-03-14 12:58:21
【问题描述】:
我完成了一些繁重的小项目。我意识到在这么短的计算时间内,我的 GUI 冻结了。所以我做了一些研究,发现了这个 => http://www.codeproject.com/Articles/4381/Threading-out-tasks-in-a-C-NET-GUI
我开始实施这是我的项目,但我意识到这个特定的实施在我的项目中不起作用。
在我的项目中,我有许多类和一个控制所有其他类的“经理”。如果我初始化这个 Manager 类,它已经在构造函数中完成了繁重的工作。
我的问题:
如何使用构造函数启动新线程?
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();
}
【问题讨论】:
标签: c# multithreading user-interface