多线程处理

一个应用程序启动时,操作系统会起一个进程。
而一个进程启动时会有一个线程,这个线程一般叫做主线程,主线程是前台线程。
 
在程序内,通过代码可以启动很多的子线程。
 
static void Main(string[] args)
{
// 这个是起一个前台线程,主线程执行结束后,必须等前台线程也执行完才退出。
var thread = new Thread(() =>
{
Thread.Sleep(3000);
});
thread.Start();
 
// 这个起的是后台线程,主线程一结束他就被结束了
Task.Run(() =>
{
Thread.Sleep(6000);
});
}
线程是前台还是后台,可以通过设置 IsBackground 属性来修改
 
 
1. Close 方法,关闭当前窗体。藏起来。
但是在这个窗体里面起的前台线程依旧运行着。
等他执行完后,过段时间之后会自行销毁。)
 
2.Application.ExitThread Application.Exit
一 先得关闭所有窗体,关闭所有消息。可以看到窗体不见了
二 执行完主线程剩下的代码
三 发送 ApplicationExit 事件
四 看看是否还有子线程,如果子线程都是后台的,那么结束所有,直接退出整个应用。
如果有前台,主线程还在,然后去得等所有前台结束。结束后全部退出。
 
3. 仅仅对于Console 那样的程序,需要调用,来退出整个进程
System.Environment.Exit(0);
 
var task = Task.Run(()=>{});
 
1. 启动
task.Start();
Task.Run 其实就直接启动了子线程,再调用 Start 会抛出异常。与此不同的是BeginInvoke
多次调用,多次起新线程执行。
 
2. 等待结束和获取结果
task.Wait 可以阻塞当前线程,等待着task的那个线程结束了,再继续执行下面代码
var task1 = Task.Factory.StartNew(() =>{return this.SnapControlMethod(gcMultiRowBounds);});
task1.Result,也是一样阻塞当前线程,这个用于task的那个线程有返回值的时候。
注意如果task的执行很快,早早就结束了,那么上面两个方法自然就不会阻塞了。而且不影响获取执行结果
posted @ 2022-07-03 18:08  内心澎湃的水晶侠  阅读(272)  评论(0编辑  收藏  举报