1

我正在设计一个应用程序,它在不同的线程上运行不同的组件。我需要一种方法来向用户界面报告这些组件的状态、它们完成的任务以及是否发生了任何错误。我的第一种方法是将所有不同的组件写入日志文件。然后我监视该文件的更改,以在文本框(我的输出窗口)中重新加载更改。但是我注意到使用文件监视器并不能很好地执行,它会减慢组件线程及其任务的速度。所以我想在vs2010中创建类似输出窗口的东西,他们可以在调试时记录任何数据,它似乎非常高效,并且可以保存大量数据。任何想法什么是最好的方法?一个重要的事实,

4

2 回答 2

1

我认为您可以通过写入日志文件来改进您的想法,只需异步执行,这样您就不会阻塞线程。

您可以使用NLoglog4net 之类的东西。

于 2012-11-07T01:03:48.007 回答
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 回答