最后几天,我尝试了解.NET中的多任务处理。我对此几乎没有疑问。 首先。我知道在.NET中存在的东西是" ThreadPool",所以如果我们使用Thread类创建新线程,我们使用ThreadPool中的线程或者创建新线程?
任务库怎么样?在msdn中我们可以读到:"表示异步操作。"但创建新线程和使用异步是两种不同的方式,对吧?那么如果我们使用Task库,我们会创建异步操作或创建新线程吗?
如果是,那么我们应该使用async / await关键字吗? 上述方法之间的区别在哪里?
答案 0 :(得分:4)
所以如果我们用Thread类创建新线程,我们使用线程来自 ThreadPool还是创建新的?
ThreadPool
执行其名称所指示的内容,它是一个线程池。当您使用Thread
课程时,您正在创建新主题,与ThreadPool
中存在的主题无关。
在msdn中我们可以读到:“表示异步操作。”但 创建新线程和使用异步是两种不同的方式, 正确?
右。执行异步操作并不意味着“创建一个新线程并在该线程上工作”。我的意思是,这是在 parallel 中做事。异步操作通常在进程中require no extra threads,它们自然是异步的,一直到操作系统。
因此,如果我们使用Task库,我们会创建异步操作或创建新操作 线程?
你可以做到这两点:
承诺式任务 - 它们与C#5中引入的async-await
运算符很好地协同工作。它们表示不需要使用线程的异步操作。这些示例可以在各种BCL类中找到,例如Stream
类,HttpClient
等。请注意,执行I / O绑定操作的大多数类都使用promise样式任务。
使用Task.Run
或Task.Factory.StartNew
。这将采用ThreadPool
线程并执行提供的委托,除非您明确告诉它您希望它使用TaskCreationOptions.LongRunning
创建新线程。
如果是,那么我们应该使用async / await关键字吗?
async-await
同意awaitable
的任何内容。 awaitable
是具有GetAwaiter
方法的任何类/结构,它返回实现INotifyCompletion
或ICriticalNotifyCompletion
接口的类型。您可以详细了解async-await
here