Task(TPL)简单的实现Winform(WPF)异步_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Task(TPL)简单的实现Winform(WPF)异步

Task(TPL)简单的实现Winform(WPF)异步

 2013/7/21 15:02:41  静女  博客园  我要评论(0)
  • 摘要:很多时候,我们要实现Winform异步操作,你可以用传统的方法,但个人感觉代码不好理解,而且使用真有点不舒服。也可以用Task来实现,Task(.net4.0新添加的对象)其实就是对线程池线程的一个封装,里面功能比较多,也比较好操作,其他的不多讲,今天只讲异步操作,举个简单的例子吧:先上个图:单击Go按钮,数字自动增加,比较简单。直接上代码:1publicpartialclassForm1:Form2{3privateCancellationTokenSourcects=null
  • 标签:for 实现 winform 异步

 

  很多时候,我们要实现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 
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即可。

 

发表评论
用户名: 匿名