多线程--Task,等待用户输入AutoResetEvent
2024-09-03 21:53:37
上一篇文章:.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日。
【注】所有文字,均为个人学习总结,仅当个人留存。若君不幸踏访,切勿讥讽,确有可取之处,不妨随心借取,确有错漏之处,还望不吝赐教。
最新文章
- 黄聪:C#中HtmlAgilityPack判断是否包含或不包含指定的属性或值
- js 获取当前日期时间3种格式化方法 yyyy-mm-dd hh:MM:ss
- java提高篇(五)-----抽象类与接口
- java问题小总结
- iOS开发--QQ音乐练习,歌词的展示,歌词的滚动,歌词的颜色变化
- CI 框架中的自定义路由规则
- DevExpress GridView 自定义搜索按钮改为中文内容
- Ubuntu安装JDK1.6
- javascript的navigator对象
- POJ 3373 Changing Digits 好蛋疼的DP
- 在IIS托管服务中设置Rewrite重定向到webapi接口
- 解决终端SSH连接服务器一段时间不操作之后卡死的问题
- Python cffi学习
- vCenter 异常关机后无法开启ESXi虚拟机的处理.
- React Router 用法
- 深入理解java虚拟机---Class文件(二十)
- Go之函数直接实现接口
- [C#]泛型约束在窗体定义上的使用
- VB6 red write DB using Microsoft DAO 3.6 Object Library
- linux通配符,grep和 egrep区别