1.线程Thread

多线程的意义在于一个应用程序中,有多个执行部分可以同时执行;对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行;等到后台线程执行完毕,再通知主线程,然后做出对应操作!

启动Thread线程

         static void Main(string[] args)
{
// 启动多线程
Thread thread = new Thread(myThreadDemo);
thread.IsBackground = true;
thread.Start(); for (int i = ; i < ; i++) // 主线程
{
Console.WriteLine("main is working...");
}
thread.Join();
} static void myThreadDemo()
{
Console.WriteLine(" >> now statr thread....");
Thread.Sleep();
Console.WriteLine(" >> thread is over..");
}

执行结果如图:

Thread thread = new Thread(myThreadDemo);启动无参无返回值ThreadStart线程,等同于 Thread thread = new Thread(myThreadDemo);

启动带参数Thread线程

         static void Main(string[] args)
{
// 启动多线程
Thread thread = new Thread(new ParameterizedThreadStart(myThreadDemo));
thread.IsBackground = true;
thread.Start("Ronaldo"); for (int i = ; i < ; i++) // 主线程
{
Console.WriteLine("main is working...");
}
thread.Join();
} static void myThreadDemo(object name)
{
Console.WriteLine(name.ToString());
Console.WriteLine(" >> now statr thread....");
Thread.Sleep();
Console.WriteLine(" >> thread is over..");
}

线程池

使用ThreadStart与ParameterizedThreadStart建立新线程非常简单,但通过此方法建立的线程难于管理,若建立过多的线程反而会影响系统的性能。

设想如果需要处理大量任务,例如网站后台对于HTTP请求的处理,那是不是要对每一个请求创建一个后台线程呢?显然这样对占用大量内存,而且频繁地创建的过程也会严重影响速度。为了应对这种情况,.net引入了线程池的概念。

线程池会把创建的线程保存起来,在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省了建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。

下面做个试验

for (int i = ; i < ; i++)
{
ThreadPool.QueueUserWorkItem(m =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
});
}
Console.Read();

可以看到,虽然执行了10次,但并没有创建10个线程。

ThreadPool可以使用工作者线程和委托类创建线程。

Task

        static void Main(string[] args)
{
//StartNew .NetFramework4.0
Task t = Task.Factory.StartNew(() =>
{
// Just loop.
int ctr = ;
for (ctr = ; ctr <= ; ctr++)
{
Thread.Sleep();
}
Console.WriteLine("Finished {0} loop iterations",
ctr);
});
Console.WriteLine("go on");
t.Wait(); //StartNew .NetFramework4.5
Task t2 = Task.Run(() =>
{
// Just loop.
int ctr = ;
for (ctr = ; ctr <= ; ctr++)
{
Thread.Sleep();
}
Console.WriteLine("Finished {0} loop iterations",
ctr);
});
Console.WriteLine("go on");
//t2.Wait(); // 等待任务完成,再进行下次操作 Task.WaitAll(); // 等待任一一个任务完成
Console.WriteLine("where i am");
Task.WaitAll(t2); // 等待t2任务完成
}

最新文章

  1. 设计模型MVC和JavaBean
  2. 查看SQL Server日志 Part 1
  3. httpclient爬取性感美图
  4. 矩阵快速幂 POJ 3735 Training little cats
  5. Photoshop支持ico输出
  6. select选项框特效
  7. java中把list列表转为arrayList以及arraylist数组截取的简单方法
  8. 论文笔记(5):Fully Convolutional Multi-Class Multiple Instance Learning
  9. Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(五)
  10. Spark学习之编程进阶总结(一)
  11. 【Python3爬虫】常见反爬虫措施及解决办法(二)
  12. Django集成Markdown编辑器【附源码】
  13. 引用文章 如何在lambda中引入递归调用
  14. 如何在Vue中建立全局引用或者全局命令
  15. UI自动化测试(六)TestNG操作详解
  16. 微信小程序-配置解答
  17. android,gridview
  18. (转)【经验之谈】Git使用之Windows环境下配置
  19. sql:sql server,MySQL,PostgreSQL的表,视图,存储过程结构查询
  20. CodeForces - 1004C

热门文章

  1. filter入门
  2. Texture Format全解析
  3. __str__&amp;__repr__
  4. HTML标签及属性
  5. Spring学习笔记(四)--MVC概述
  6. 解决&quot;authentication token manipulation error&quot;
  7. nginx相关教程
  8. JSON_UNESCAPED_UNICODE
  9. 05 Computing GC Content
  10. 二项分布&amp;超几何分布