1

私はアプリケーションを設計しており、それぞれ異なるスレッドで異なるコンポーネントを実行しています。これらのコンポーネントの状態と完了したタスク、およびエラーが発生したかどうかをユーザー インターフェイスに報告する方法が必要です。私の最初のアプローチは、すべての異なるコンポーネントからログ ファイルに書き込むことでした。そして、そのファイルの変更を監視し、変更をテキスト ボックス (出力ウィンドウ) に再読み込みしました。ただし、ファイル モニターを使用するとパフォーマンスが低下し、コンポーネント スレッドとそのタスクの速度が低下することに気付きました。そこで、vs2010 の出力ウィンドウのようなものを作成することを考えていました。ここでは、デバッグ中に任意のデータをログに記録できます。非常に効率的で、大量のデータを保持できるようです。最善のアプローチは何ですか?1つの重要な事実、

4

2 に答える 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 に答える
1

ログファイルに書き込むだけでアイデアを改善できると思います。非同期で実行するだけで、スレッドがブロックされることはありません。

NLoglog4netのようなものを使用できます。

于 2012-11-07T01:03:48.007 に答える