WINFORM开发中常用的UI线程同步相关代码
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.Threading.Tasks; using System.Threading; namespace ThreadTestApp { ////// 线程同步测试 /// public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnInvoke_Click(object sender, EventArgs e) { //1.直接调用 OperateUI(DoSomeThing("直接调用")); //2.同步器调用 var v2 = new Task(() => DoSomeThing("同步器调用")); v2.Start(); v2.ContinueWith((o) => { OperateUI(o.Result); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext()); //3.异步异常捕捉 var v3 = new Task (() => DoSomeThing("ThrowEx")); v3.Start(); v3.ContinueWith((o) => { OperateUI(v3.Exception.InnerExceptions[0].Message); }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext()); //4.经典UI调用 ThreadPool.QueueUserWorkItem((o) => { Classic(DoSomeThing("经典UI调用")); }); } private void Classic(string v) { if (this.InvokeRequired) //需要找到一个调用控件 { Action a = new Action (OperateUI); this.Invoke(a, new object[] { v }); } else { OperateUI(v); } } private void OperateUI(string v) { tabDisplay.TabPages.Add(v); lblDisplay.Text = v; MessageBox.Show(v); this.Text = v; } private string DoSomeThing(string v) { if (v == "ThrowEx") throw new Exception("自定义异常"); else return "[" + v + "]"; } } }