Task(TPL)简单的实现Winform(WPF)异步
很多时候,我们要实现Winform异步操作,你可以用传统的方法,但个人感觉代码不好理解,而且使用真有点不舒服。也可以用Task来实现,Task(.net4.0新添加的对象)其实就是对线程池线程的一个封装,里面功能比较多,也比较好操作,其他的不多讲,今天只讲异步操作,举个简单的例子吧:
先上个图:单击Go按钮,数字自动增加,比较简单。
直接上代码:
1 public partial class Form1 : Form 2 { 3 private CancellationTokenSource cts = null;//主要用于中断线程 4 private TaskScheduler taskScheduler; 5 6 public Form1() 7 { 8 InitializeComponent(); 9 10 //获取当前线程上下文 11 taskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 12 } 13 14 /*传统方法*/ 15 private void UpdateText(string text) 16 { 17 if (this.InvokeRequired) 18 btnTask.Invoke(new Action<string>(UpdateText), text); 19 else 20 btnTask.Text = text; 21 } 22 23 private void GoByThread() 24 { 25 Thread thread = new Thread(() => 26 { 27 for (int i = 0; ; i++) 28 { 29 Thread.Sleep(200); 30 UpdateText(i.ToString()); 31 } 32 }); 33 thread.IsBackground=true;
34 thread.Start(); 35 } 36 37 /*Task*/ 38 private void GoByTask() 39 { 40 if (cts == null) 41 { 42 cts = new CancellationTokenSource(); 43 44 Task.Factory.StartNew(() => 45 { 46 for (int i = 0; ; i++) 47 { 48 Thread.Sleep(200); 49 50 //下面是关键代码,内嵌一个Task 51 Task.Factory.StartNew(() => 52 { 53 btnTask.Text = i.ToString(); 54 }, cts.Token, TaskCreationOptions.AttachedToParent, taskScheduler); 55 } 56 }, cts.Token); 57 } 58 } 59 60 //按钮单击事件 61 private void btnTask_Click(object sender, EventArgs e) 62 { 63 //GoByThread(); 64 GoByTask(); 65 } 66 }
如果是在WPF当中,传统的方法还得改点代码,而用Task不需要修改代码,TaskScheduler.FromCurrentSynchronizationContext()能够获取当前是Winform线程还是WPF线程,而且传统方法中UpdatText方法老觉得看着有点别扭,用Task只需在Task中再开启一个Task即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探