using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncAwait
{
class Program
{
//http://www.cnblogs.com/sheng-jie/p/6471986.html
// 3.3. 什么是前台线程
// 默认情况下,使用Thread.Start()方法创建的线程都是前台线程。前台线程能阻止应用程序的终结,只有所有的前台线程执行完毕,CLR才能关闭应用程序(即卸载承载的应用程序域)。前台线程也属于工作者线程。

//3.4. 什么是后台线程
// 后台线程不会影响应用程序的终结,当所有前台线程执行完毕后,后台线程无论是否执行完毕,都会被终结。一般后台线程用来做些无关紧要的任务(比如邮箱每隔一段时间就去检查下邮件,天气应用每隔一段时间去更新天气)。后台线程也属于工作者线程。

static void Main(string[] args)
{

//C# async关键字用来指定某个方法、Lambda表达式或匿名方法自动以异步的方式来调用。
Console.WriteLine("主线程启动,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
var task = GetLengthAsync();

Console.WriteLine("回到主线程,当前线程为:" + Thread.CurrentThread.ManagedThreadId);

Console.WriteLine("线程【" + Thread.CurrentThread.ManagedThreadId + "】睡眠5s:");
Thread.Sleep(5000); //将主线程睡眠5s

var timer = new Stopwatch();
timer.Start(); //开始计算时间

Console.WriteLine("task的返回值是" + task.Result);

timer.Stop(); //结束点,另外StopWatch还有Reset方法,可以重置。
Console.WriteLine("等待了:" + timer.Elapsed.TotalSeconds + "秒");//显示时间

Console.WriteLine("主线程结束,当前线程为:" + Thread.CurrentThread.ManagedThreadId);

//Console.WriteLine("主线程开始!");

//ForeBackGround();
//ThreadPoolTest();
Console.ReadKey();
}

private static async Task<int> GetLengthAsync()
{
Console.WriteLine("GetLengthAsync()开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId);

var str = await GetStringAsync();

Console.WriteLine("GetLengthAsync()执行完毕,当前线程为:" + Thread.CurrentThread.ManagedThreadId);

return str.Length;
}

private static Task<string> GetStringAsync()
{
Console.WriteLine("GetStringAsync()开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
return Task.Run(() =>
{
Console.WriteLine("异步任务开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId);

Console.WriteLine("线程【" + Thread.CurrentThread.ManagedThreadId + "】睡眠10s");
Thread.Sleep(10000); //将异步任务线程睡眠10s

return "GetStringAsync()执行完毕";

});

}

public static void TaskDemo2()
{
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
Task.Run(() => Console.WriteLine("Task对应线程ID:" + Thread.CurrentThread.ManagedThreadId));
Console.ReadLine();
}

public static void TaskDemo()
{
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);

Task.Factory.StartNew(() => Console.WriteLine("Task对应线程ID:" + Thread.CurrentThread.ManagedThreadId));
Console.ReadKey();
}

/// <summary>
/// ThreadPool(线程池)
/// </summary>
public static void ThreadPoolTest()
{
WaitCallback workItem = state => Console.WriteLine("当前线程Id为:" + Thread.CurrentThread.ManagedThreadId);

for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(workItem);
}

}

/// <summary>
/// 前台线程、后台线程
/// </summary>
private static void ForeBackGround()
{
//创建前台工作线程
Thread t1 = new Thread(Task1);
t1.Start();

//创建后台工作线程
Thread t2 = new Thread(new ParameterizedThreadStart(Task2));
t2.IsBackground = true; //设置为后台线程
t2.Start("传参");
}

private static void Task1()
{
Thread.Sleep(1000); //模拟耗时操作,睡眠1S
Console.WriteLine("前台线程被调用!");
}

private static void Task2(object data)
{
Thread.Sleep(2000); //模拟耗时操作,睡眠2S
Console.WriteLine("后台线程被调用!" + data);
}

}
}

ParameterizedThreadStart task的更多相关文章

  1. C#多线程的用法2-线程的生命周期

    对于线程而言有两种类型:前台线程,后台线程.前台与后台线程性质相同,但终止条件不同. 后台线程:在运行过程中如果宿主进程结束,线程将直接终止执行:在强制终止时,线程即终止执行不论线程代码是否执行完毕. ...

  2. .NET Task揭秘(一)

    Task为.NET提供了基于任务的异步模式,它不是线程,它运行在线程池的线程上.本着开源的精神, 本文以解读基于.NET4.5 Task源码的方式来揭秘Task的实现原理.   Task的创建 Tas ...

  3. 多线程 thread和Task的用法以及注意事项

    并行 多核线程:Task 首先引用System.Threading; 1:用静态方法:Task.Factory.StartNew()来创建了一个最简单的Task: Task.Factory.Start ...

  4. 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读

    记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...

  5. C# Task 是什么?返回值如何实现? Wait如何实现

    关于Task的API太多了,网上的实例也很多,现在我们来说说Task究竟是个什么东西[task一般用于多线程,它一定与线程有关],还有它的返回值有事怎么搞的. 首先我们以一个最简单的API开始,Tas ...

  6. Thread,ThreadPool,Task, 到async await 的基本使用方法和理解

    很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...

  7. C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel

    大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...

  8. Thread、ThreadPool、Task、Parallel、Async和Await基本用法、区别以及弊端

    多线程的操作在程序中也是比较常见的,比如开启一个线程执行一些比较耗时的操作(IO操作),而主线程继续执行当前操作,不会造成主线程阻塞.线程又分为前台线程和后台线程,区别是:整个程序必须要运行完前台线程 ...

  9. 多线程调用有参数的方法---c# Thread 与 Task

    C#实现多线程的方式:Task——任务   简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完 ...

随机推荐

  1. 3-基于LoG的特征检测子

  2. [NOIP2016]天天爱跑步 题解(树上差分) (码长短跑的快)

    Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要 玩家每天按时上线,完成打卡任务.这个游戏的地图 ...

  3. iphone5越狱后问题的解决办法

    1,添加各种源失败,显示红字. 解决办法: 如果出现bad 404等红字,一般是由于网络问题,服务器挤爆了,导致不能添加,这种情况大家可以换一个时间段添加源,或者使用网速快一点的网络,比如3g,多试几 ...

  4. goroutine 需要注意的一个小细节

    虽然goroutine 是并发执行的,但是它们并不是并行运行的.如果不告诉Go 额外的东西,同一时刻只会有一个goroutine 执行.利用runtime.GOMAXPROCS(n) 可以设置goro ...

  5. chromedriver安装(谷歌浏览器驱动安装)

    如果程序执行错误,浏览器没有打开,那么应该是没有装 Chrome 浏览器或者 Chrome 驱动没有配置在环境变量里.下载驱动,然后将驱动文件路径配置在环境变量即可. chromedriver下载地址 ...

  6. ASP.NET Core学习——2

    Application Startup ASP.NET Core为应用程序提供了处理每个请求的完整控制.Startup类是应用程程的入口(entry point),这个类可以设置配置(configur ...

  7. springboot使用自带连接池连接postgre

    Application配置spring.datasource.url=jdbc:postgresql://***:5432/postgresspring.datasource.username=pos ...

  8. REST Client实际应用记录

    请求Content-Type为application/x-www-form-urlencoded 先来看一个完整示例: ############## ### qa问答 @msg="糖尿病患者 ...

  9. MySql 主从复制及深入了解

    分享一个不错的mysql文章 https://segmentfault.com/a/1190000008942618

  10. SVM-SVR

    高频率的接触到了SVM模型,而且还有使用SVM模型做回归的情况,即SVR.另外考虑到自己从第一次知道这个模型到现在也差不多两年时间了,从最开始的腾云驾雾到现在有了一点直观的认识,花费了不少时间.因此在 ...