C# 窗体程序后台线程操做窗体控件

源码以下:编辑器

// For Method Two
    public delegate void SetTextCallback(string text);

    public partial class MainForm : Form
    {
        // For Method One
        System.Threading.SynchronizationContext m_SyncContext = null;

        // For Method Three
        private BackgroundWorker m_Worker = null;

        public MainForm()
        {
            InitializeComponent();

            // For Method One
            this.m_SyncContext = System.Threading.SynchronizationContext.Current;

            // For Method Three
            this.m_Worker = new System.ComponentModel.BackgroundWorker();
            this.m_Worker.WorkerReportsProgress = true;
            this.m_Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
            this.m_Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

            // For Method Four
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        #region For Method One

        private void btnStartThreadForMethodOne_Click(object sender, EventArgs e)
        {
            System.Threading.Thread th = new System.Threading.Thread(ThreadRunForMethodOne);
            th.IsBackground = true;
            th.Start();
        }

        private void ThreadRunForMethodOne()
        {
            m_SyncContext.Post(Post, "SynchronizationContext-Post.");
        }

        private void Post(object text)
        {
            this.txtDisplayForMethodOne.Text = text.ToString();
        }

        #endregion

        #region For Method Two

        private void btnStartThreadForMethodTwo_Click(object sender, EventArgs e)
        {
            System.Threading.Thread th = new System.Threading.Thread(ThreadRunForMethodTwo);
            th.IsBackground = true;
            th.Start();
        }

        private void ThreadRunForMethodTwo()
        {
            this.SetText("This text was set safely.");
        }

        private void SetText(string text)
        {
            if (this.txtDisplayForMethodTwo.InvokeRequired)
            {
                while (!this.txtDisplayForMethodOne.IsHandleCreated)
                {
                    if (this.txtDisplayForMethodTwo.Disposing || this.txtDisplayForMethodOne.IsDisposed)
                        return;
                }
                this.txtDisplayForMethodTwo.Invoke(new SetTextCallback(SetText), new object[] { text });
            }
            else
            {
                this.txtDisplayForMethodTwo.Text = text;
            }
        }

        #endregion

        #region For Method Three

        private void btnStartThreadForMethodThree_Click(object sender, EventArgs e)
        {
            if (!this.m_Worker.IsBusy)
            {
                this.m_Worker.RunWorkerAsync();
            }
        }

        private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            txtDisplayForMethodThree.Text = e.Result.ToString();
        }

        private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            e.Result = "Update UI by using BackgroundWorker";
        }
        #endregion

        #region For Method Four

        private void btnStartThreadForMethodFour_Click(object sender, EventArgs e)
        {
            System.Threading.Thread th = new System.Threading.Thread(ThreadRunForMethodFour);
            th.IsBackground = true;
            th.Start();
        }

        private void ThreadRunForMethodFour()
        {
            txtDisplayForMethodFour.Text = "CheckForIllegalCrossThreadCalls = false";
        }

        #endregion
        
    }

 

partial class MainForm
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理全部正在使用的资源。
        /// </summary>
        /// <param name="disposing">若是应释放托管资源,为 true;不然为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.label1 = new System.Windows.Forms.Label();
            this.btnStartThreadForMethodOne = new System.Windows.Forms.Button();
            this.txtDisplayForMethodOne = new System.Windows.Forms.TextBox();
            this.groupBox2 = new System.Windows.Forms.GroupBox();
            this.label2 = new System.Windows.Forms.Label();
            this.btnStartThreadForMethodTwo = new System.Windows.Forms.Button();
            this.txtDisplayForMethodTwo = new System.Windows.Forms.TextBox();
            this.groupBox3 = new System.Windows.Forms.GroupBox();
            this.label3 = new System.Windows.Forms.Label();
            this.btnStartThreadForMethodThree = new System.Windows.Forms.Button();
            this.txtDisplayForMethodThree = new System.Windows.Forms.TextBox();
            this.groupBox4 = new System.Windows.Forms.GroupBox();
            this.label4 = new System.Windows.Forms.Label();
            this.btnStartThreadForMethodFour = new System.Windows.Forms.Button();
            this.txtDisplayForMethodFour = new System.Windows.Forms.TextBox();
            this.groupBox1.SuspendLayout();
            this.groupBox2.SuspendLayout();
            this.groupBox3.SuspendLayout();
            this.groupBox4.SuspendLayout();
            this.SuspendLayout();
            // 
            // groupBox1
            // 
            this.groupBox1.Controls.Add(this.label1);
            this.groupBox1.Controls.Add(this.btnStartThreadForMethodOne);
            this.groupBox1.Controls.Add(this.txtDisplayForMethodOne);
            this.groupBox1.Location = new System.Drawing.Point(12, 12);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(368, 132);
            this.groupBox1.TabIndex = 0;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "Method One";
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(33, 29);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(173, 12);
            this.label1.TabIndex = 2;
            this.label1.Text = "Using SynchronizationContext";
            // 
            // btnStartThreadForMethodOne
            // 
            this.btnStartThreadForMethodOne.Location = new System.Drawing.Point(34, 80);
            this.btnStartThreadForMethodOne.Name = "btnStartThreadForMethodOne";
            this.btnStartThreadForMethodOne.Size = new System.Drawing.Size(304, 35);
            this.btnStartThreadForMethodOne.TabIndex = 1;
            this.btnStartThreadForMethodOne.Text = "启动线程";
            this.btnStartThreadForMethodOne.UseVisualStyleBackColor = true;
            this.btnStartThreadForMethodOne.Click += new System.EventHandler(this.btnStartThreadForMethodOne_Click);
            // 
            // txtDisplayForMethodOne
            // 
            this.txtDisplayForMethodOne.Location = new System.Drawing.Point(34, 53);
            this.txtDisplayForMethodOne.Name = "txtDisplayForMethodOne";
            this.txtDisplayForMethodOne.Size = new System.Drawing.Size(304, 21);
            this.txtDisplayForMethodOne.TabIndex = 0;
            // 
            // groupBox2
            // 
            this.groupBox2.Controls.Add(this.label2);
            this.groupBox2.Controls.Add(this.btnStartThreadForMethodTwo);
            this.groupBox2.Controls.Add(this.txtDisplayForMethodTwo);
            this.groupBox2.Location = new System.Drawing.Point(386, 12);
            this.groupBox2.Name = "groupBox2";
            this.groupBox2.Size = new System.Drawing.Size(368, 132);
            this.groupBox2.TabIndex = 0;
            this.groupBox2.TabStop = false;
            this.groupBox2.Text = "Method Two";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(33, 29);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(155, 12);
            this.label2.TabIndex = 2;
            this.label2.Text = "Using Invoke/BegainInvoke";
            // 
            // btnStartThreadForMethodTwo
            // 
            this.btnStartThreadForMethodTwo.Location = new System.Drawing.Point(34, 80);
            this.btnStartThreadForMethodTwo.Name = "btnStartThreadForMethodTwo";
            this.btnStartThreadForMethodTwo.Size = new System.Drawing.Size(304, 35);
            this.btnStartThreadForMethodTwo.TabIndex = 1;
            this.btnStartThreadForMethodTwo.Text = "启动线程";
            this.btnStartThreadForMethodTwo.UseVisualStyleBackColor = true;
            this.btnStartThreadForMethodTwo.Click += new System.EventHandler(this.btnStartThreadForMethodTwo_Click);
            // 
            // txtDisplayForMethodTwo
            // 
            this.txtDisplayForMethodTwo.Location = new System.Drawing.Point(34, 53);
            this.txtDisplayForMethodTwo.Name = "txtDisplayForMethodTwo";
            this.txtDisplayForMethodTwo.Size = new System.Drawing.Size(304, 21);
            this.txtDisplayForMethodTwo.TabIndex = 0;
            // 
            // groupBox3
            // 
            this.groupBox3.Controls.Add(this.label3);
            this.groupBox3.Controls.Add(this.btnStartThreadForMethodThree);
            this.groupBox3.Controls.Add(this.txtDisplayForMethodThree);
            this.groupBox3.Location = new System.Drawing.Point(12, 166);
            this.groupBox3.Name = "groupBox3";
            this.groupBox3.Size = new System.Drawing.Size(368, 132);
            this.groupBox3.TabIndex = 0;
            this.groupBox3.TabStop = false;
            this.groupBox3.Text = "Method Three";
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(33, 29);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(137, 12);
            this.label3.TabIndex = 2;
            this.label3.Text = "Using BackgroundWorker";
            // 
            // btnStartThreadForMethodThree
            // 
            this.btnStartThreadForMethodThree.Location = new System.Drawing.Point(34, 80);
            this.btnStartThreadForMethodThree.Name = "btnStartThreadForMethodThree";
            this.btnStartThreadForMethodThree.Size = new System.Drawing.Size(304, 35);
            this.btnStartThreadForMethodThree.TabIndex = 1;
            this.btnStartThreadForMethodThree.Text = "启动线程";
            this.btnStartThreadForMethodThree.UseVisualStyleBackColor = true;
            this.btnStartThreadForMethodThree.Click += new System.EventHandler(this.btnStartThreadForMethodThree_Click);
            // 
            // txtDisplayForMethodThree
            // 
            this.txtDisplayForMethodThree.Location = new System.Drawing.Point(34, 53);
            this.txtDisplayForMethodThree.Name = "txtDisplayForMethodThree";
            this.txtDisplayForMethodThree.Size = new System.Drawing.Size(304, 21);
            this.txtDisplayForMethodThree.TabIndex = 0;
            // 
            // groupBox4
            // 
            this.groupBox4.Controls.Add(this.label4);
            this.groupBox4.Controls.Add(this.btnStartThreadForMethodFour);
            this.groupBox4.Controls.Add(this.txtDisplayForMethodFour);
            this.groupBox4.Location = new System.Drawing.Point(386, 166);
            this.groupBox4.Name = "groupBox4";
            this.groupBox4.Size = new System.Drawing.Size(368, 132);
            this.groupBox4.TabIndex = 0;
            this.groupBox4.TabStop = false;
            this.groupBox4.Text = "Method Four";
            // 
            // label4
            // 
            this.label4.AutoSize = true;
            this.label4.Location = new System.Drawing.Point(33, 29);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(173, 12);
            this.label4.TabIndex = 2;
            this.label4.Text = "Using Cancel Thread Crossing";
            // 
            // btnStartThreadForMethodFour
            // 
            this.btnStartThreadForMethodFour.Location = new System.Drawing.Point(34, 80);
            this.btnStartThreadForMethodFour.Name = "btnStartThreadForMethodFour";
            this.btnStartThreadForMethodFour.Size = new System.Drawing.Size(304, 35);
            this.btnStartThreadForMethodFour.TabIndex = 1;
            this.btnStartThreadForMethodFour.Text = "启动线程";
            this.btnStartThreadForMethodFour.UseVisualStyleBackColor = true;
            this.btnStartThreadForMethodFour.Click += new System.EventHandler(this.btnStartThreadForMethodFour_Click);
            // 
            // txtDisplayForMethodFour
            // 
            this.txtDisplayForMethodFour.Location = new System.Drawing.Point(34, 53);
            this.txtDisplayForMethodFour.Name = "txtDisplayForMethodFour";
            this.txtDisplayForMethodFour.Size = new System.Drawing.Size(304, 21);
            this.txtDisplayForMethodFour.TabIndex = 0;
            // 
            // MainForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(766, 316);
            this.Controls.Add(this.groupBox4);
            this.Controls.Add(this.groupBox3);
            this.Controls.Add(this.groupBox2);
            this.Controls.Add(this.groupBox1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.Name = "MainForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Four Motheds For Update UI In Background Thread";
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.groupBox2.ResumeLayout(false);
            this.groupBox2.PerformLayout();
            this.groupBox3.ResumeLayout(false);
            this.groupBox3.PerformLayout();
            this.groupBox4.ResumeLayout(false);
            this.groupBox4.PerformLayout();
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Button btnStartThreadForMethodOne;
        private System.Windows.Forms.TextBox txtDisplayForMethodOne;
        private System.Windows.Forms.GroupBox groupBox2;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Button btnStartThreadForMethodTwo;
        private System.Windows.Forms.TextBox txtDisplayForMethodTwo;
        private System.Windows.Forms.GroupBox groupBox3;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Button btnStartThreadForMethodThree;
        private System.Windows.Forms.TextBox txtDisplayForMethodThree;
        private System.Windows.Forms.GroupBox groupBox4;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.Button btnStartThreadForMethodFour;
        private System.Windows.Forms.TextBox txtDisplayForMethodFour;
    }