跨线程的安全更新控件
在你的工程中的扩展方法类中写下一个SafeCall方法: using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public static class Extensions { public static void SafeCall(this Control ctrl, Action callback) { if (ctrl.InvokeRequired) ctrl.Invoke(callback); else callback(); } } } 它只是把你要保护起来的代码作为一个回调而已。然后任何需要保护一些代码的地方都可以这样调用: using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(h => { for (var i = 0; i < 10000000; i++) { label1.SafeCall(() => { label1.Text = i.ToString(); }); Thread.Sleep(100); } }); } } }
当然,使用lamda是我的一个“坏毛病”。其实这里完全可以使用传统的匿名委托写法: using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(h => { for (var i = 0; i < 10000000; i++) { label1.SafeCall(delegate() { label1.Text = i.ToString(); }); Thread.Sleep(100); } }); } } }
作者:阿笨
【官方QQ一群:跟着阿笨一起玩NET(已满)】:422315558
【官方QQ二群:跟着阿笨一起玩C#(已满)】:574187616
【官方QQ三群:跟着阿笨一起玩ASP.NET(已满)】:967920586
【官方QQ四群:Asp.Net Core跨平台技术开发(可加入)】:829227829
【官方QQ五群:.NET Core跨平台开发技术(可加入)】:647639415
【网易云课堂】:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628
【腾讯课堂】:https://abennet.ke.qq.com
【51CTO学院】:https://edu.51cto.com/sd/66c64
【微信公众号】:微信搜索:跟着阿笨一起玩NET