私は少し重労働を起こす小さなプロジェクトを終了しました。私はこの短い計算時間で、私のGUIがフリーズすることに気づいた。だから私はいくつかの研究を行いましたが、私はこれを発見しました=>http://www.codeproject.com/Articles/4381/Threading-out-tasks-in-a-C-NET-GUIコンストラクタで新しいスレッドを開始する
私はこのプロジェクトを実装し始めましたが、この特定の実装が私のプロジェクトでは機能しないことに気付きました。
私のプロジェクトには、他のすべてのクラスを管理するクラスと1つの「マネージャ」があります。この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();
}
}
編集:私は私のプログラムを修正することを決め 大丈夫。重い持ち上げは1つの機能にありますが、私は間違いを犯したと思います。
全体のプログラムは次のようになります。
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