public partial class Form1 : Form
    {
        private delegate void FlushClient();//代理
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread thread = new Thread(CrossThreadFlush);
            thread.IsBackground = true;
            thread.Start();
        }        private void CrossThreadFlush()
        {
            while (true)
            {
                //将sleep和无限循环放在等待异步的外面
                Thread.Sleep(1000);
                ThreadFunction();
            }
        }
        private void ThreadFunction()
        {
            if (this.textBox1.InvokeRequired)//等待异步
            {
                FlushClient fc = new FlushClient(ThreadFunction);
                this.Invoke(fc);//通过代理调用刷新方法
            }
            else
            {
                this.textBox1.Text = DateTime.Now.ToString();
            }
        }
    }
>>>>>>>>>>>>>>>>>>>>>>>>>>>.下面这段代码没有明白<<<<<<<<<<<<<<<<<<<<<<<<,
private void ThreadFunction()
        {
            if (this.textBox1.InvokeRequired)//等待异步
            {
                FlushClient fc = new FlushClient(ThreadFunction);
                this.Invoke(fc);//通过代理调用刷新方法
            }
            else
            {
                this.textBox1.Text = DateTime.Now.ToString();
            }
        }
<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
请详细解释一下,这为什么有防止卡死的效果

解决方案 »

  1.   

    非UI线程不能操作UI控件,所以必须判断this.textBox1.InvokeRequired,是否是非UI线程调用如果是,那么使用委托this.Invoke(fc);吧fc方法发送到UI线程,让UI线程执行如果不是,那么说明是UI线程操作,this.textBox1.Text = DateTime.Now.ToString();直接修改
    防止卡死的效果 还可以使用DoEvent 或则使用BackgroundWorker,还有就是使用同步上下文,启动一个新的Thread时传递给他。