1.在运行打印结果时,窗体Form1是无法移动的,这就是窗体作为主线程被阻塞。
有时候我们难免会遇到要做特别消耗时间的一些操作。
因此,解决上述问题 就要用多线程
2.按钮2点击事件,注册一个线程来运行Run这个函数,而thread.Start表示注册的线程开始运行。
按钮3点击事件是获取线程的状态
3.第一个是只含一个参数的构造函数
第二个是含多个的构造函数
在按钮4点击事件里第三个是注册线程来运行函数1,在thread.Start里面将需要的参数进行赋值。
第四个是注册线程来运行函数2并将需要的参数进行赋值。
注:第三个和第四个表达的方式是差不多的
区别:(1)第三个只能传一个参数,而第四个可以不传参数,也可以传一个,也可以传多个参数
4.构造两个函数
注册线程A来运行吃饭函数,注册线程B来运行睡觉函数,注册线程C来控制线程A和B,当线程A运行完之后线程B再运行,运行完后停止线程。
5.第一个就是定义要抢两张票
第二个是构造一个抢票函数
其中lock相当于一个门,对于多线程抢占一个变量时如果没有门就会引起争斗,导致票这个变量变为负数。
因此需要lock在有一个线程进来时将门锁住直至运行结束放其他一个线程进来。
6.下面代码中1和2运行结果等于3,Invoke是一种委托用来执行里面的行为
7.第一个是构造一个函数来改变标签上的文本显示。
第二个是按钮点击事件
第三个是一个异步操作来运行构造函数
第四个是防止线程阻塞,做一个线程的延续,也叫线程的异步来执行Console.WriteLine(task.Result);这个语句
8.第一个构造函数
第二个是子线程而if语句是主线程所以不安全,因此委托执行这个Console.WriteLine("当前线程名称>:" + Thread.CurrentThread.Name);
Console.WriteLine("当前线程ID>:" + Thread.CurrentThread.ManagedThreadId);
button1.Text = index.ToString();语句
先命名和获取ID,然后获取当前的线程和ID
按钮2点击事件就是用来改变当前线程名称的,这里没有命名所以为空
9.第一个构造函数判断鼠标长按时间index最多为5并且将index数字显示在窗体上。
第二个是鼠标按下事件,其中flag是判断鼠标有没有在按住按钮。
第三个是鼠标抬起事件这时鼠标已经抬起
10.(1)第一个是定义两个线程
第二个是当前坐标
第三个构造函数MoveRunRow时实现按钮的垂直运动
这个MoveRunCol构造函数时实现水平移动
(2)
(3)出现这个问题代表线程执行时是不安全的
所以,添加这个代码就可以在线程不安全情况下运行