多线程

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace _04线程演示
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread t1;
        private void button1_Click(object sender, EventArgs e)
        {
            //MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
            //1.创建一个线程对象,把DoWhile方法传递进去,表示
            //该线程启动后会执行这个方法
            t1 = new Thread(new ThreadStart(DoWhile));

            //把当前线程设置为后台线程
            t1.IsBackground = true;
            //前台线程、后台线程
            //默认创建的进程都是“前台线程”,只有当所有“前台线程”都执行完毕后“进程”才会结束。
            //可以通过IsBackground=true,把指定线程设置为后台线程。
            //后台线程在所有前台线程执行完毕后,自动退出。

            //2.启动这个线程
            t1.Start();//向操作系统请求启动线程。



        }

        private void DoWhile()
        {
            //MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
            //int index = 0;
            while (true)
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
                Thread.Sleep(500);
                //index++;
                //if (index > 10)
                //{
                //    //设置当前线程“休息”3秒钟
                //    Thread.Sleep(3000);
                //}
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (t1 != null)
            {
                t1.Abort();
                //t1.Suspend();
                //t1.Resume();
            }
        }
    }
}
多线程Code

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Threading.Tasks;

namespace _05线程其他演示
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 启动线程调用无参数无返回值方法
            //Thread t1 = new Thread(new ThreadStart(M1));
            //t1.Start();
            //Console.WriteLine("ok");
            //Console.ReadKey();
            #endregion

            #region 启动一个线程执行带参数的方法

            //Thread t1 = new Thread(new ParameterizedThreadStart(M2));
            //t1.Start(100);
            //Console.WriteLine("主线程继续。。。。ok");
            //Console.ReadKey();

            #endregion


            #region 通过另一种方式启动一个线程执行带参数的方法(把方法封装一下)
            ////思路:把要执行的方法封装成一个类
            ////把原本方法的参数,变成类的属性
            ////在方法中把使用参数的地方都用属性来替换
            ////在调用该方法的时候,为属性赋值,即为参数赋值。
            //MyClass mc = new MyClass();
            //mc.Number = 101;
            //Thread t1 = new Thread(new ThreadStart(mc.M3));
            //t1.Start();
            //Console.WriteLine("ok");
            //Console.ReadKey();
            #endregion

            #region 通过启动一新线程,执行带返回值的方法BackgroundWorker


            //Console.WriteLine("Main(string[] args)方法中:当前执行的线程编号:{0}", Thread.CurrentThread.ManagedThreadId);

            ////BackgroundWorker
            ////创建一个后台执行者对象
            //BackgroundWorker backWorker = new BackgroundWorker();
            ////设置该对象要在后台执行的方法
            //backWorker.DoWork += new DoWorkEventHandler(backWorker_DoWork);

            ////设置另外一个事件:当程序执行完毕后触发的事件
            //backWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backWorker_RunWorkerCompleted);

            ////开始执行
            //backWorker.RunWorkerAsync(new int[] { 1, 100 });
            //Console.WriteLine("主线程继续.......");
            //Console.ReadKey();
            ////Task

            #endregion
        }

        //当后台方法执行完毕后触发的事件
        static void backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("backWorker_RunWorkerCompleted方法中:当前执行的线程编号:{0}", Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("最后输出结果是:{0}", e.Result);
        }


        //要在后台执行的方法
        static void backWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Console.WriteLine("backWorker_DoWork方法中:当前执行的线程编号:{0}", Thread.CurrentThread.ManagedThreadId);
            if (e.Argument != null)
            {
                int[] arr = e.Argument as int[];
                //把方法调用完毕后的值赋值给e.Result
                e.Result = Sum(arr[0], arr[1]);
            }

        }
        static int Sum(int from, int to)
        {
            int sum = 0;
            for (int i = from; i <= to; i++)
            {
                sum += i;
            }
            return sum;
        }

        //static void M3(int n)
        //{
        //    int sum = 0;
        //    for (int i = 1; i < n; i++)
        //    {
        //        sum += i;
        //    }
        //    Console.WriteLine(sum);
        //}

        static void M2(object n)
        {
            int max = (int)n;
            int sum = 0;
            for (int i = 1; i < max; i++)
            {
                sum += i;
            }
            Console.WriteLine(sum);
        }

        static void M1()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }
    }

    public class MyClass
    {
        public int Number
        {
            get;
            set;
        }
        public void M3()
        {
            int sum = 0;
            for (int i = 1; i < this.Number; i++)
            {
                sum += i;
            }
            Console.WriteLine(sum);
        }
    }
}
多线程在.net中的使用

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace _07跨线程控件访问
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //不要用这种方式!!!!!!!!
            //Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.textBox1.Text = "你好!";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(new ThreadStart(() =>
            {
                //如果在这里直接使用这个控件,则是在t1线程中来访问textbox1控件,这样是不允许的。
                //this.textBox1.Text = "你好!";

                //解决思路:将操作控件的代码,不要在t1线程中执行,把操作控件的代码放到主线程中执行UI线程。
                //如何把this.textBox1.Text = "你好!";这句带代码在主线程中执行

                //任何控件的Invoke()方法表示将指定的代码在创建该控件的线程中执行
                //该方法有两个意思:1.找到创建textbox1控件的线程2.把Invoke()的参数(就是一个委托),设置在创建该控件的线程上执行。
                //Invoke(参数1,参数2)参数1:表示要在创建该控件的线程上执行的方法。参数2是一个可变参数,表示要执行的方法的参数列表。要执行的方法有几个参数则传递几个值。
                this.textBox1.Invoke(new Action<string>(UpdateTextBox),"你好呀!");
            }));
            t1.IsBackground = true;
            t1.Start();
        }

        private void UpdateTextBox(string msg)
        {
            this.textBox1.Text = msg;
        }
    }
}
跨线程控件访问

 

posted on 2014-11-19 10:47  Struggling Rookie  阅读(78)  评论(0编辑  收藏  举报