私はアプリケーションを設計しており、それぞれ異なるスレッドで異なるコンポーネントを実行しています。これらのコンポーネントの状態と完了したタスク、およびエラーが発生したかどうかをユーザー インターフェイスに報告する方法が必要です。私の最初のアプローチは、すべての異なるコンポーネントからログ ファイルに書き込むことでした。そして、そのファイルの変更を監視し、変更をテキスト ボックス (出力ウィンドウ) に再読み込みしました。ただし、ファイル モニターを使用するとパフォーマンスが低下し、コンポーネント スレッドとそのタスクの速度が低下することに気付きました。そこで、vs2010 の出力ウィンドウのようなものを作成することを考えていました。ここでは、デバッグ中に任意のデータをログに記録できます。非常に効率的で、大量のデータを保持できるようです。最善のアプローチは何ですか?1つの重要な事実、
質問する
1174 次
2 に答える
1
このサンプルコードのようなことができない理由はわかりません(同期とスレッドの停止はすべて行っていると思います。これは、Control.Invokeを使用して作成する簡単な例です。スレッドセーフです。BeginInvokeを使用することもでき、textBoxに書き込んでいるスレッドをブロックしません):
List<Thread> threads = new List<Thread>();
bool closeThreads;
private void button1_Click(object sender, EventArgs e)
{
closeThreads = false;
for (int i = 1; i < 10; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));
threads.Add(t);
t.Start(i);
}
}
private void button2_Click(object sender, EventArgs e)
{
closeThreads = true;
foreach (Thread t in threads)
{
if (t.ThreadState != ThreadState.Stopped)
t.Join(3);
}
}
delegate void textWriter(string textToWrite);
void WriteText(string textToWrite)
{
this.textBox1.AppendText(textToWrite);
}
void ThreadMethod(object i)
{
int threadNumber = (int)i;
int currentNumber = 100 * threadNumber;
Random rand = new Random(threadNumber);
while(!closeThreads)
{
currentNumber = (currentNumber + rand.Next(0,100))%1000;
Thread.Sleep(currentNumber);
//textBox1.Invoke(new textWriter(WriteText), new object[]{"Thread " + threadNumber.ToString() + " " + currentNumber.ToString() + Environment.NewLine});
//this won't block your threads
string text = "Thread " + threadNumber.ToString() + " " + currentNumber.ToString() + Environment.NewLine;
textBox1.BeginInvoke(new textWriter(WriteText), new object[]{text});
}
}
Buttons
コードを試すには、2つと1つのフォームを作成する必要がありますTextBox
于 2012-11-07T01:41:34.787 に答える