(转)C#/.NET主线程与子线程之间的关系
2016-07-15 17:44
239 查看
一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程。
有的博客上说“至少一个主线程”,这一说法持有怀疑
主线程与子线程之间的关系
**默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程
*当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束
*当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束
(个人理解,这样设计的原因:因为后台线程一般做的都是需要花费大量时间的工作,如果不这样设计,主线程已经结束,而后台工作线程还在继续,第一有可能使程序陷入死循环,第二主线程已经结束,后台线程即时执行完成也已经没有什么实际的意义)
实例代码:
static Thread Mainthread; //静态变量,用来获取主线程
static void Main(string[] args)
{
Mainthread= Thread.CurrentThread;//获取主线程
Test1();
}
private static void Test1()
{
Console.WriteLine("在主进程中启动一个线程!");
Thread firstChild = new Thread(new ParameterizedThreadStart(ThreadProc));//threadStart 是一个委托,代表一个类型的方法
firstChild.Name = "线程1";
firstChild.IsBackground = true;
firstChild.Start(firstChild.Name);//启动线程
Thread secondChild = new Thread(new ParameterizedThreadStart(ThreadProc));
secondChild.Name = "线程2";
secondChild.IsBackground = true;
secondChild.Start(secondChild.Name);
Console.WriteLine("主线程结束");
Console.WriteLine(Mainthread.ThreadState);
Mainthread.Abort();
}
private static void ThreadProc(object str)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Mainthread.ThreadState);
Console.Write(str+"调用ThreadProc: " + i.ToString() + "\r\n");
if (i == 9)
Console.WriteLine(str + "结束");
Thread.Sleep(2000);//线程被阻塞的毫秒数。0表示应挂起此线程以使其他等待线程能够执行
}
}
有的博客上说“至少一个主线程”,这一说法持有怀疑
主线程与子线程之间的关系
**默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程
*当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束
*当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束
(个人理解,这样设计的原因:因为后台线程一般做的都是需要花费大量时间的工作,如果不这样设计,主线程已经结束,而后台工作线程还在继续,第一有可能使程序陷入死循环,第二主线程已经结束,后台线程即时执行完成也已经没有什么实际的意义)
实例代码:
static Thread Mainthread; //静态变量,用来获取主线程
static void Main(string[] args)
{
Mainthread= Thread.CurrentThread;//获取主线程
Test1();
}
private static void Test1()
{
Console.WriteLine("在主进程中启动一个线程!");
Thread firstChild = new Thread(new ParameterizedThreadStart(ThreadProc));//threadStart 是一个委托,代表一个类型的方法
firstChild.Name = "线程1";
firstChild.IsBackground = true;
firstChild.Start(firstChild.Name);//启动线程
Thread secondChild = new Thread(new ParameterizedThreadStart(ThreadProc));
secondChild.Name = "线程2";
secondChild.IsBackground = true;
secondChild.Start(secondChild.Name);
Console.WriteLine("主线程结束");
Console.WriteLine(Mainthread.ThreadState);
Mainthread.Abort();
}
private static void ThreadProc(object str)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Mainthread.ThreadState);
Console.Write(str+"调用ThreadProc: " + i.ToString() + "\r\n");
if (i == 9)
Console.WriteLine(str + "结束");
Thread.Sleep(2000);//线程被阻塞的毫秒数。0表示应挂起此线程以使其他等待线程能够执行
}
}
相关文章推荐
- C#中一个简单的输入输出流
- C#导出Excel-利用特性自定义数据
- C#Lambda
- C#数组的声明方式
- VS2010 c#创建及调用Webservice
- DataTable添加Row,DataRow[]转换为DataTable
- C#实现导出Excel
- 学习笔记--C#深复制和浅复制
- C#Winform程序的打包,发布和升级
- C#中IP地址与数字之间的互转
- c#用正则表达式判断字符串是否全是数字、小数点、正负号组成 Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
- 关于C#的WebBrowser内存占用太大的解决办法
- 《C#高级编程》读书笔记(十):内存管理和指针
- c# 页面打印预览 并保存为PDF
- C# 获取系统图标
- 抽象类与接口的区别于联系
- 【转】【C#】ColorMatrix
- Obsolete(C# 编程指南)
- C#常用集合的使用
- C#项目中的遇到的函数