博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thread
阅读量:4563 次
发布时间:2019-06-08

本文共 3431 字,大约阅读时间需要 11 分钟。

一、启动线程调用无参数无返回值方法

Thread t1 = new Thread(new ThreadStart(M1));//参数ThreadStart是无参无返回值的委托;这个线程并没有启动            t1.Start();//向操作系统请求启动线程。什么时候执行由cpu决定            Console.WriteLine("ok");            Console.ReadKey();     static void M1()        {            for (int i = 0; i < 10; i++)            {                Console.WriteLine(i);            }        }

二、启动一个线程执行带参数的方法

Thread t1 = new Thread(new ParameterizedThreadStart(M2));            t1.Start(100);            Console.WriteLine("主线程继续。。。。ok");            Console.ReadKey();//上面的参数ParameterizedThreadStart是一个object类型的委托   static void M2(object n)        {            int max = (int)n;            int sum = 0;            for (int i = 1; i < max; i++)            {                sum += i;            }            Console.WriteLine(sum);        }

三、通过另一种方式启动一个线程执行带参数的方法(把方法封装一下)

//思路:把要执行的方法封装成一个类            //把原本方法的参数,变成类的属性            //在方法中把使用参数的地方都用属性来替换            //在调用该方法的时候,为属性赋值,即为参数赋值。            MyClass mc = new MyClass();            mc.Number = 101;            Thread t1 = new Thread(new ThreadStart(mc.M3));            t1.Start();            Console.WriteLine("ok");            Console.ReadKey();  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);        }    }

四、线程的其他常用成员

//Thread.CurrentThread.Priority = ThreadPriority.Lowest;//线程优先级            Thread t = new Thread(new ThreadStart(() =>            {                for (int i = 0; i < 5; i++)                {                    Console.WriteLine(".");                    Thread.Sleep(1000);                }            }));           t.IsBackground = true;//设置为后台线程,默认是前台线程!后台线程设置的意义就是进程结束(所有前台线程退出了),后台线程也会退出,否则主程序退出后线程没执行完还在继续跑            t.Name = "我的线程";//只能赋值一次,多次赋值出错            //t.Priority = ThreadPriority.Highest;            t.Start();            Console.WriteLine("主线程继续执行......");            for (int i = 0; i < 5; i++)            {                Console.WriteLine("=");                Thread.Sleep(1000);            }            Console.WriteLine("主线程该做的已经做完了,开始等待t线程结束");            //这句话(t.Join();)在哪个线程中执行,那么就阻塞了那个线程,那个线程要等待t线程执行完毕后,然后才会继续。            t.Join();//阻塞当前"主线程",等待t线程执行完毕后,继续主线程的执行。            t.Join(1000); //1000表示超时时间,这里“主线程”会等待t线程执行完毕,只等待1000毫秒,超过1000毫秒后,“主线程”继续执行。            //t.ThreadState=ThreadState          t.Abort();//终止这个线程的执行            Console.WriteLine("主线程执行完毕!");            Console.ReadKey();

五、winform跨线程访问的问题

1、 告诉控件不检查跨线程访问,最后不这样做!看第二条Control.CheckForIllegalCrossThreadCalls = false;2、比如textBox1.Text = "你好!";  Thread t1 = new Thread(new ThreadStart(() =>            {                //如果在这里直接使用这个控件,则是在t1线程中来访问textbox1控件,这样是不允许的。                //this.textBox1.Text = "你好!";                //解决思路:将操作控件的代码,不要在t1线程中执行,把操作控件的代码放到主线程中执行UI线程。                //任何控件的Invoke()方法表示将指定的代码在创建该控件的线程中执行                //该方法有两个意思:1.找到创建textbox1控件的线程2.把Invoke()的参数(就是一个委托),设置在创建该控件的线程上执行。                //Invoke(参数1,参数2)参数1:表示要在创建该控件的线程上执行的方法。参数2是一个可变参数,表示要执行的方法的参数列表。要执行的方法有几个参数则传递几个值。                this.textBox1.Invoke(new Action
((msg) => { textBox1.Text = msg; }), "你好!"); })); t1.IsBackground = true; t1.Start();

  

 

转载于:https://www.cnblogs.com/entclark/p/8025374.html

你可能感兴趣的文章
sentinel控制台
查看>>
selenium 难定位元素,时间插件,下拉框定位,string包含,定位列表中的一个,技巧...
查看>>
【转】一些数据格式化-Eval( " ")和DataBinder.Eval(Container.DataItem, " ")的区别及用法...
查看>>
斗地主算法的设计与实现(四)--对牌进行排序
查看>>
How to get web browser history using cursor
查看>>
软键盘覆盖EditText解决方法
查看>>
Daily Scrumming* 2015.11.1(Day 13)
查看>>
css不定高图文垂直居中的三种方法
查看>>
剑指offer--1.二维数组中的查找
查看>>
第3次作业:团队介绍
查看>>
[html][javascript]父子窗体传值
查看>>
收房细则
查看>>
读《Android深度探索(卷1)HAL与驱动开发》的一些思考10
查看>>
二十三、uevnet机制和U盘自动挂载
查看>>
Kettle 提取mongodb最大编号
查看>>
Vue2.0-token权限处理
查看>>
Caffeine缓存
查看>>
JavaScript 回车键转成Tab键
查看>>
CentOS7配置MySQL5.7主备
查看>>
合并区间(LintCode)
查看>>