为什么表单会冻结?

时间:2011-09-18 11:43:15

标签: c# winforms multithreading

这个程序在线程中写入1到5000的数字,但主要形式仍然冻结。 哪里出错?提前致谢。

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int how, current;
        bool job;
        Object lockobj = new Object();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Started!");
            how = 5000;
            current = 0;
            job = true;
            Thread worker = new Thread(Go);
            worker.Name = "1";
            worker.Start();
        }

        private void Go()
        {
            while (job)
            {
                if (current < how)
                {

                    lock (lockobj)
                    {
                        current++;
                    }

                    log(string.Format("Thread #{0}: {1}", Thread.CurrentThread.Name, current));
                }
                else
                {
                    job = false;
                }
            }
        }


        private void log(string text)
        {
            Action A = new Action(() =>
            {
                richTextBox1.AppendText(text + System.Environment.NewLine);
            });

            if (richTextBox1.InvokeRequired)
                this.BeginInvoke(A);
            else A();
        }
    }


}

2 个答案:

答案 0 :(得分:3)

它冻结是因为您在文本框上快速渲染并且GUI没有时间保持同步。请记住,此呈现发生在主GUI线程上,并通过调用BeginInvoke来更新文本框,因此实际上会消耗此主GUI线程的所有资源。尝试降低记录的频率以避免此行为。

答案 1 :(得分:3)

因为你的大部分工作都将花在

        if (richTextBox1.InvokeRequired)
            this.BeginInvoke(A);

当您调用表单时,它会被锁定。

做一些真正的工作,比如Thread.Sleep(1000); :-),而不是current++;,你的表单会在更新之间做出回应。