• 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即可。

  • 相关阅读:
    MySQL/MariaDB数据库的多表查询操作
    Mariadb/MySQL多实例实战
    Mariadb/MySQL生产环境的my.cnf配置示例
    Mariadb/MySQL数据库单表查询基本操作及DML语句
    Mariadb/MySQL安装方式实战篇
    MySQL数据库扫盲篇
    数据库分类及基础概念
    Docker的系统资源限制及验正
    Docker Private Registry 常用组件
    Dockerfile详解
  • 原文地址:https://www.cnblogs.com/chenlinfei/p/3203632.html
Copyright © 2020-2023  润新知