我正在设计一个应用程序,它在不同的线程上运行不同的组件。我需要一种方法来向用户界面报告这些组件的状态、它们完成的任务以及是否发生了任何错误。我的第一种方法是将所有不同的组件写入日志文件。然后我监视该文件的更改,以在文本框(我的输出窗口)中重新加载更改。但是我注意到使用文件监视器并不能很好地执行,它会减慢组件线程及其任务的速度。所以我想在vs2010中创建类似输出窗口的东西,他们可以在调试时记录任何数据,它似乎非常高效,并且可以保存大量数据。任何想法什么是最好的方法?一个重要的事实,
问问题
1174 次
2 回答
1
好吧,我不明白为什么您不能在此示例代码中执行类似的操作(我必须说,我认为您正在执行所有同步和线程停止,这只是使用 Control.Invoke 进行操作的一个快速示例线程安全,您也可以使用 BeginInvoke,它不会阻塞正在写入文本框的线程):
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
于 2012-11-07T01:41:34.787 回答