上一篇文章:.NET:如何让线程支持超时?已经说明目前微软主推的多线程方案是task: 注意:Task最好引用.NET4.5。 4.0也行,但不成熟。Thread引用2.0就够了。

1.通过构造函数创建的task,必须手动Start,而通过工厂创建的Task直接就启动了。

var task1 = new Task(() => {    }); task.Start();

var task2 = Task.Factory.StartNew(() =>{    });

Task[] tasks = new Task[];

      var tasks[] = Task.Factory.StartNew(() =>{    });

      var tasks[] = Task.Factory.StartNew(() => {   });

. task1.Status:Created;WaitingToRun; RanToCompletion;

. task1.Wait(); Task.WaitAll(task1, task2); Task.WaitAny(task1, task2);

. var result = task1.ContinueWith<string>(task => {    }); //<>里为task返回值类型。

. 取消:

var tokenSource = new CancellationTokenSource();

var token = tokenSource.Token;

var task = Task.Factory.StartNew(() =>{if (token.IsCancellationRequested) { return;} //执行的内容。}, token);

token.Register(() => { Console.WriteLine("Canceled"); });

tokenSource.Cancel();

例2:CancellationTokenSource cts =new CancellationTokenSource();

Task<int> t=new Task<int>(() =>Add(cts.Token),cts.Token);  //Add(CancellationToken ct)为执行的任务

t.Start();

t.ContinueWith(TaskEnded);//TaskEnded为完成时执行的任务

三、任务工厂TaskFactory:和Task.Factory类似。但TaskFactory能共享任务状态,如把CancellationTokenSource共享,就可以同时取消一组任务。

CancellationTokenSource cts = new CancellationTokenSource();            

TaskFactory taskFactory = new TaskFactory();

            Task[] tasks = new Task[]

                { 

                    taskFactory.StartNew(() => Add(cts.Token)),

                    taskFactory.StartNew(() => Add(cts.Token)),

                    taskFactory.StartNew(() => Add(cts.Token))

                }; 

 //CancellationToken.None指示TasksEnded不能被取消

taskFactory.ContinueWhenAll(tasks, TasksEnded, CancellationToken.None); 

            Console.ReadKey(); 

            cts.Cancel(); 

            Console.ReadKey(); 

// TasksEnded(Task[] tasks)为取消时执行的内容。

 // ContinueWhenAll和ContinueWhenAny方法,是一组任务完成后执行。

参考文献:

http://blog.csdn.net/djc11282/article/details/17524013

http://www.cnblogs.com/luminji/archive/2011/05/13/2044801.html

http://www.wxzzz.com/689.html

二、使用AutoResetEvent实现等待用户输入后执行:

      private void button1_Click(object sender, EventArgs e)

        {
Thread th = new Thread(YourThread);
th.Start();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text.Length >= )
{
detailCollectedEvent.Set(); // 当textBox1的文本超过4位,发一个通知
}
}
AutoResetEvent detailCollectedEvent = new AutoResetEvent(false);
void YourThread()
{
MessageBox.Show("input you bank account details into the textbox");
detailCollectedEvent.WaitOne(); // 等候通知
MessageBox.Show("we will keep the secret.");
}

本来想写一个挂Q的工具,所以才研究了一下以上内容,因为挂Q必须采用多线程工厂模式TaskFactory。而且需要输入验证码,就要用等待用户输入 AutoResetEvent,但后来发现有比较完善的挂Q工具了,所以就没继续写,http://www.qyisoft.com/ 奇易WebQQ挂Q工具

本文由正态分布X~N(μ,σ2 ) QQ2052702900写于2015年8月21日。

【注】所有文字,均为个人学习总结,仅当个人留存。若君不幸踏访,切勿讥讽,确有可取之处,不妨随心借取,确有错漏之处,还望不吝赐教。

最新文章

  1. 黄聪:C#中HtmlAgilityPack判断是否包含或不包含指定的属性或值
  2. js 获取当前日期时间3种格式化方法 yyyy-mm-dd hh:MM:ss
  3. java提高篇(五)-----抽象类与接口
  4. java问题小总结
  5. iOS开发--QQ音乐练习,歌词的展示,歌词的滚动,歌词的颜色变化
  6. CI 框架中的自定义路由规则
  7. DevExpress GridView 自定义搜索按钮改为中文内容
  8. Ubuntu安装JDK1.6
  9. javascript的navigator对象
  10. POJ 3373 Changing Digits 好蛋疼的DP
  11. 在IIS托管服务中设置Rewrite重定向到webapi接口
  12. 解决终端SSH连接服务器一段时间不操作之后卡死的问题
  13. Python cffi学习
  14. vCenter 异常关机后无法开启ESXi虚拟机的处理.
  15. React Router 用法
  16. 深入理解java虚拟机---Class文件(二十)
  17. Go之函数直接实现接口
  18. [C#]泛型约束在窗体定义上的使用
  19. VB6 red write DB using Microsoft DAO 3.6 Object Library
  20. linux通配符,grep和 egrep区别

热门文章

  1. .net页面实时预览图片
  2. Vim配置Node.js开发工具
  3. vue 组件中数据传递
  4. Jmeter接口测试示例
  5. Python在线教程
  6. Leetcode 之Evaluate Reverse Polish Notation(41)
  7. redis之(二)redis单机的安装,配置,启动,关闭
  8. python安装numpy和scipy的资源
  9. CentOS7.5安装notepadqq
  10. Java容器类解析