源码以下:编辑器
// 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; }