zoukankan      html  css  js  c++  java
  • 多线程--Task,等待用户输入AutoResetEvent

    上一篇文章:.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[2];
    
          var tasks[0] = Task.Factory.StartNew(() =>{    });
    
          var tasks[1] = Task.Factory.StartNew(() => {   });
    
    2. task1.Status:Created;WaitingToRun; RanToCompletion;
    
    3. task1.Wait(); Task.WaitAll(task1, task2); Task.WaitAny(task1, task2);
    
    4. var result = task1.ContinueWith<string>(task => {    }); //<>里为task返回值类型。
    
    5. 取消:
    
    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 >= 4)
                {
                    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】windows下IOS开发基础环境搭建
    【oracle常见错误】oracle监听程序配置/“ORA-12541: TNS: 无监听程序”
    【oracle】oracle REGEXP_SUBSTR分割字符串
    【Oracle安装卸载】oracle卸载
    【oracle】一些的常用命令
    oracle备份与还原(导入导出)
    oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
    oracle表空间扩容
    oracle实现like多关键字查询
    __builtin_ _Find_first()
  • 原文地址:https://www.cnblogs.com/qq2052702900/p/5569722.html
Copyright © 2011-2022 走看看