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. 导出EXCEL(带数据)

    /* * 导出EXCEL * @param req * @param resp * @param model * @param info * @return */ @RequestMapping(va ...

  2. java EE学习流程(第二版更新)

    这周有点堕落了,这两天啥都没写,就顾上刷<庆余年>了

  3. JZOI1062 【USACO2013JAN】invite

    #include <bits/stdc++.h> #define ll long long #define INF 2147483647 #define ll_INF 9223372036 ...

  4. 深入理解C指针第一章小结1

    1.1 指针和内存,C程序在编译后,会以三种形式使用内存. (1) 静态/全局内存:在程序开始时分配,程序结束才消失,所有函数都能访问全局变量,static静态变量的作用域局限在定义它们的函数内部 ( ...

  5. unittest框架学习笔记一之testcase

    # coding=utf-8案例一: 2 ''' 3 Created on 2017-7-22 4 @author: Jennifer 5 Project:登录百度测试用例 6 ''' 7 from ...

  6. No parameter name specified for argument of type

    在使用SpringMVC绑定基本类型(如String,Integer等)参数时,应通过@RequestParam注解指定具体的参数名称,否则,当源代码在非debug模式下编译后,运行时会引发Handl ...

  7. 【NodeJS】Error: Cannot find module 'ms'

    报错原因: Error: Cannot find module 'ms' at Function.Module._resolveFilename (module.js::) at Function.M ...

  8. Ubuntu终端内打开文件管理器

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     近段时间在ubuntu中搭建jdk并在jdk的 ...

  9. 第一周任务Largest Submatrix of All 1’s

    Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 9512   Ac ...

  10. 根据不同运行环境配置和组织node.js应用

    安装node-config模块 npm install config --save || yarn add config mkidr config // 创建config文件夹 在config文件夹下 ...