Thread,Task和async / await关键字之间的区别

时间:2014-09-29 15:41:03

标签: c# .net task-parallel-library async-await

最后几天,我尝试了解.NET中的多任务处理。我对此几乎没有疑问。 首先。我知道在.NET中存在的东西是" ThreadPool",所以如果我们使用Thread类创建新线程,我们使用ThreadPool中的线程或者创建新线程?

任务库怎么样?在msdn中我们可以读到:"表示异步操作。"但创建新线程和使用异步是两种不同的方式,对吧?那么如果我们使用Task库,我们会创建异步操作或创建新线程吗?

如果是,那么我们应该使用async / await关键字吗? 上述方法之间的区别在哪里?

1 个答案:

答案 0 :(得分:4)

哇,这些都是很多问题。让我们尝试一步一步:

  

所以如果我们用Thread类创建新线程,我们使用线程来自   ThreadPool还是创建新的?

ThreadPool执行其名称所指示的内容,它是一个线程池。当您使用Thread课程时,您正在创建主题,与ThreadPool中存在的主题无关。

  

在msdn中我们可以读到:“表示异步操作。”但   创建新线程和使用异步是两种不同的方式,   正确?

右。执行异步操作并不意味着“创建一个新线程并在该线程上工作”。我的意思是,这是在 parallel 中做事。异步操作通常在进程中require no extra threads,它们自然是异步的,一直到操作系统。

  

因此,如果我们使用Task库,我们会创建异步操作或创建新操作   线程?

你可以做到这两点:

  1. 承诺式任务 - 它们与C#5中引入的async-await运算符很好地协同工作。它们表示不需要使用线程的异步操作。这些示例可以在各种BCL类中找到,例如Stream类,HttpClient等。请注意,执行I / O绑定操作的大多数类都使用promise样式任务。

  2. 使用Task.RunTask.Factory.StartNew。这将采用ThreadPool线程并执行提供的委托,除非您明确告诉它您希望它使用TaskCreationOptions.LongRunning创建新线程。

  3.   

    如果是,那么我们应该使用async / await关键字吗?

    async-await同意awaitable的任何内容。 awaitable是具有GetAwaiter方法的任何类/结构,它返回实现INotifyCompletionICriticalNotifyCompletion接口的类型。您可以详细了解async-await here