多线程--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日。

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

原文地址:https://www.cnblogs.com/qq2052702900/p/5569722.html