上一篇文章:.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日。

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

多线程--Task,等待用户输入AutoResetEvent的更多相关文章

  1. 练习:等待用户输入input()

    等待用户输入 执行下面的程序在按回车键后就会等待用户输入: 实例(Python 3.0+) #!/usr/bin/python3 input("\n\n按下 enter 键后退出." ...

  2. c#如何实现一个线程暂停,等待用户输入文本后继续运行?

    using System; using System.Text; using System.Windows.Forms; using System.Threading; namespace Windo ...

  3. Jquery 搜索等待用户输入完成时自动执行

    $('#fuzzySearchBox').on('keyup', function (event) { var searchStr = $(this).val().toLowerCase(); //i ...

  4. acedGetString获取用户输入字符串

    acedGetString()[ads_getstring()]int acedGetString(int cronly, const TCHAR *prompt, TCHAR *psz) acedG ...

  5. 用户输入与while循环

    函数input()的工作原理: 函数input()让程序短暂运行,等待用户输入一些文本,获取用户输入后将其存储在一个变量中 测试input()功能-- #!/usr/bin/env python#fi ...

  6. 《Linux命令行与shell脚本编程大全》第十四章 处理用户输入

    有时还会需要脚本能够与使用者交互.bash shell提供了一些不同的方法来从用户处获得数据, 包括命令行参数,命令行选项,以及直接从键盘读取输入的能力. 14.1 命令行参数 就是添加在命令后的数据 ...

  7. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

  8. python入门学习:6.用户输入和while循环

    python入门学习:6.用户输入和while循环 关键点:输入.while循环 6.1 函数input()工作原理6.2 while循环简介6.3 使用while循环处理字典和列表 6.1 函数in ...

  9. 第七章 用户输入和while语句

    大多数编程都旨在解决最终用户的问题,为此通常需要从用户那里获取一些信息.例如,假设有人要判断自己是否到了投票的年龄,要编写回答这个问题的程序,就需要知道用户的年龄,这样才能给出答案.因此,这种程序需要 ...

随机推荐

  1. 超级rtmp服务器和屌丝wowza

    超级rtmp服务器和屌丝wowza http://blog.csdn.net/win_lin/article/details/11927973

  2. 【POJ2420】A star not a tree?

    蒟蒻开始学模拟退火…… 起初一直不肯学,因为毕竟玄学算法…… 哎呀玄学怎么就没用呢?对不对? #include<iostream> #include<cstdio> #incl ...

  3. 坐标转换——GCJ-02

    WGS84(World Geodetic System 1984),是为GPS 全球定位系统 使用而建立的坐标系统GCJ-02,我国在WGS84的基础上加密得到BD-09,百度坐标在GCJ-02基础上 ...

  4. Redis、mongdb、memcached的个人总结

    有测试的实例:http://colbybobo.iteye.com/blog/1986786 详细描述优缺点:https://www.cnblogs.com/binyue/p/4582550.html

  5. 使用js创建select option

    var v_select = document.getElementById("selectA");  var v_option = document.createElement( ...

  6. POJ 1456 Supermarket(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...

  7. textarea在浏览器中固定大小

    HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...

  8. Java学习笔记(二)——Java操作properties文件

    [前面的话] 前段时间在学习和玩java web相关的东西,对于这些技术,一边学习,一边做东西,一边总结,希望可以一边成长和有所收获.有时总是思考太多反而成为了前进的阻力,所以对于生活还是简单一些,不 ...

  9. 【JBPM4】任务节点-任务分配swimlane

    swimlane泳道,几个任务受理人相同的任务节点,可以划分为一个泳道 JPDL <?xml version="1.0" encoding="UTF-8" ...

  10. nodejs里的express自动刷新gulp-express使用【转载】

    搬运自[http://blog.csdn.net/zhu_free/article/details/51476525] gulp-express实现实时刷新 本来使用gulp-connect可以创建本 ...