浅谈.NET下的多线程和并行计算(二)线程基本知识

首先来看看如何创建线程:

Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
Thread t1 = new Thread(() =>
   {
     Thread.Sleep(1000);
     Thread t = Thread.CurrentThread;
     Console.WriteLine("Name: " + t.Name);
     Console.WriteLine("ManagedThreadId: " + t.ManagedThreadId);
     Console.WriteLine("State: " + t.ThreadState);
     Console.WriteLine("Priority: " + t.Priority);
     Console.WriteLine("IsBackground: " + t.IsBackground);
     Console.WriteLine("IsThreadPoolThread: " + t.IsThreadPoolThread);
   })
   {
     Name = "Thread1",
     Priority = ThreadPriority.Highest
   };
t1.Start();
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);

我们在Thread的构造方法中传入一个Lambda表达式,对应ThreadStart委托(无参void返回值的方法) 来构造一个线程任务。这段程序中有几个注意点:

1)从输出结果中可以看到,当前程序启动后就3三个线程,新开线程后显示为4个线程,在线程方法中 休眠了一秒,防止主线程执行完次线程就过早结束了。

2)我们可以为线程设置一个名字,方便调试。我们也可以设置线程的优先级,这个在之后会有进一步 介绍。

3)第7行,托管线程的唯一标识符,微软建议使用托管线程的Id而不是操作系统中线程的Id来跟踪线 程。

4)第10行代码输出了当前线程不是后台线程,也就是是前台线程,这是默认值。进程会等待前台线程 结束结束,而如果是后台线程的话,所有前台线程结束后后台线程自动终止。对于Windows GUI应用程序 来说,使用后台线程很可能发生诡异现象,也就是在程序从任务管理器的应用程序一栏中消失后其进程还 在,只能通过手动终止进程来释放内存。

5)第11行代码表明这个线程不是由线程池创建的,有关线程池见后文的介绍。

计算(二)线程基本知识-java 多线程并行执行">

那么我们再来看看如何为线程传入参数,一种方式是使用匹配ParameterizedThreadStart委托 (object参数void返回值)的方法:

new Thread((date) => Console.WriteLine(((DateTime)date).ToString())).Start (DateTime.Now);

时间: 2024-11-01 01:10:37

浅谈.NET下的多线程和并行计算(二)线程基本知识的相关文章

浅谈.NET下的多线程和并行计算(一)前言

作为一个ASP.NET开发人员,在之前的开发经历中接触多线程编程的机会并不是很多,但是随着.NET 4.0的发布临近,我越来越感受到未来的1-2年中并行计算将会有很大的应用.于是决定通过写日志的方式 来总结一下.NET 3.5下的多线程编程进而引入.NET 4.0提供的新的并行库以及新的并行编程模式和编程的 思维方式. 个人觉得在日常的编程中对于ASP.NET程序员来说使用多线程编程不是很多,其实我们无时无刻不在享 受多线程的优势.首先,WEB服务器环境就是一个多线程环境,每一个请求都是独立的线

浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础 下

在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI 线程上操作控件,否则很容易产生人品问题.可以想到,上次介绍的两个Timer基于ThreadPool,回调方 法运行于不同于UI线程的新线程上,在这个方法中操作控件需要进行 Invoke或BeginInvoke.其实,还有 第三种System.Windows.Forms.Timer,它可以让回调事件在UI线程上执行,我们来做一个实验比较一下 System.Windows.Forms.T

浅谈.NET下的多线程和并行计算(四)线程同步基础 下

回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore.这些用于线程同 步的结构叫做同步基元.同步基元从类型上可以分为锁定/通知/联锁三种.lock显然锁定方式,而且是独 占锁定,也就是在锁释放之前不能由其它线程获得. Semaphore也是一种锁定,只不过不是独占锁,可以 指定多少个线程访问代码块.AutoResetEvent和ManualResetEvent当然就是通知方式了,前者在通行之后 自动重置,后者需要手动重置.我们还看

浅谈.NET下的多线程和并行计算(十四)并行计算前言

之前的文章中我们介绍了如何在.NET下运用相关类库进行多线程编程的基础,我们知道.NET 4.0已经 正式推出了,带来的重要特性是并行库.本文就谈谈对并行计算的一些理解和看法.并行计算不是一个很 新的概念,其实它就是通过多线程把同一个任务分割成多个子任务并行的执行的过程..NET 4.0并行库不 但提供了这方面的支持,而且还封装了多线程开发的各种场景,使得我们不需要依赖Thread/同步基元等 "底层"的对象就可以进行多线程开发.没有.NET 4.0的并行计算库我们同样可以进行并行计算

浅谈.NET下的多线程和并行计算(十).NET异步编程模型基础 上

谈多线程谈到现在,我们要明确多线程的一个好处是可以进行并行的运算(充分利用多核处理器,对 于桌面应用程序来说就更重要一点了,没有WEB服务器,利用多核只能靠自己),还有一个好处就是异步 操作,就是我们可以让某个长时间的操作独立运行,不妨碍主线程继续进行一些计算,然后异步的去返回 结果(也可以不返回).前者能提高性能是因为能利用到多核,而后者能提高性能是因为能让CPU不在等 待中白白浪费,其实异步从广义上来说也可以理解为某种并行的运算.在之前的这么多例子中,我们大多 采用手工方式来新开线程,之前也

浅谈.NET下的多线程和并行计算(十三)CLR via C#第三版阅读笔记(2)

线程同步的问题 1) 我们必须找到代码中所有可能被多个线程同时访问的资源,然后使用线程同步来保护资源,并且 我们没有办法来验证是不是正确进行了线程同步,包括是否有遗漏和是否对不需要同步的资源进行同步. 2) 线程同步是有损性能的,如果某个操作大量执行,并且这个操作原先的执行时间非常短,那么如 果我们对这段操作前后进行锁的申请和释放的话性能可能下降一个数量级. 3) 线程同步可能导致更频繁的线程创建和上下文的切换. 当然,只有在下面的情况下才需要线程同步,换句话说我们尽量不要使用下面的方案来导致线

浅谈.NET下的多线程和并行计算(十二)CLR via C#第三版阅读笔记(1)

最近此书出了第三版,在阅读此书线程部分的过程中有很多心得,补充了此前知识盲点,因此把这些 关键和重要的知识点汇集成日志文章并且纳入到这个系列中.顺便说一下,笔者喜欢这本书的原因是作者 作为微软顾问并没有按照MSDN的教条教大家怎么去用而是能说出很多自己的观点甚至很多是微软.NET框架 不够的地方,并给出自己的实现. 为什么说线程是比较昂贵的? 1)从内存上来说,(对于32位架构)每一个线程包含线程内核对象(700字节)/线程环境块(4KB)/ 内核堆栈(12KB)/用户堆栈(1MB).并且可以发

浅谈.NET下的多线程和并行计算(十一).NET异步编程模型基础 下

上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是 Thread(ThreadPool)+信号量+ 锁+Control.Invoke..NET的异步编程模型给我们提供了一种基于 IAsyncResult的编程模式,它尤其适用于处理下面的应用场景: 1) 被阻止,正在等待一个 IAsyncResult 2) 被阻止,正在等待多个 IAsyncResult 对象 3) 轮询 IAsyncResult 上的完成情形 .NET还提供了基于事件的异步编程模式,它能够提供:

浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础 上

首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下 : Thread.Sleep(1000); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append("test"); string s = sb.ToString(); textBox1.Text = s; 首先我们可以把这个操作理解为一个非常耗时的操作,它至少占用1秒的时间.