我正在设计一个应用程序,它在不同的线程上运行不同的组件。我需要一种方法来向用户界面报告这些组件的状态以及它们完成的任务以及是否发生任何错误。我的第一种方法是从所有不同的组件写入日志文件。然后我监视该文件的更改,在文本框(我的输出窗口)中重新加载更改。但是我注意到使用文件监视器的性能不是很好,它会减慢组件线程及其任务的速度。所以我想在vs2010中创建类似输出窗口的东西,它们可以在调试时记录任何数据,它似乎非常高效,并且可以容纳大量数据。任何想法什么是最好的方法?一个重要的事实是,应该有一种方法可以将所有组件线程与日志输出窗口进行通信,以显示结果,避免冲突等。我使用的是.NET 4.0
答案 0 :(得分:1)
答案 1 :(得分: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
和一个TextBox