C# 线程、任务和异步/等待关键字之间的区别
最后几天我尝试在.NET中学习多任务处理。对此我没有什么问题。 首先我知道在.NET中存在一个名为“ThreadPool”的东西,所以如果我们用thread类创建新线程,我们使用ThreadPool中的thread还是创建新线程 任务库呢。在msdn中我们可以读到:“表示异步操作。”但是创建新线程和使用异步是两种不同的方式,对吗?所以,如果我们使用任务库,我们是创建异步操作还是创建新线程 如果是,那么何时应该使用async/await关键字?C# 线程、任务和异步/等待关键字之间的区别,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,最后几天我尝试在.NET中学习多任务处理。对此我没有什么问题。 首先我知道在.NET中存在一个名为“ThreadPool”的东西,所以如果我们用thread类创建新线程,我们使用ThreadPool中的thread还是创建新线程 任务库呢。在msdn中我们可以读到:“表示异步操作。”但是创建新线程和使用异步是两种不同的方式,对吗?所以,如果我们使用任务库,我们是创建异步操作还是创建新线程 如果是,那么何时应该使用async/await关键字? 上述方法的区别在哪里?让我们尝试打断每个问题: 所以
上述方法的区别在哪里?让我们尝试打断每个问题: 所以,如果我们使用thread类创建新线程,我们将使用thread from 线程池还是创建新的线程池
ThreadPool
按照其名称所示,它是一个线程池。当您使用线程
类时,您正在创建一个新的线程,与线程池
中存在的线程无关
在msdn中,我们可以读到:“表示异步操作。”
创建新线程和使用异步是两种不同的方式,
对吧?
对。执行异步操作并不意味着“创建一个新线程并在该线程上工作”。我的意思是,这是并行的。异步操作通常在整个过程中进行,它们自然是异步的,一直到操作系统
所以,如果我们使用任务库,我们将创建异步操作或创建新的
线
您可以同时执行以下两项操作:
async await
操作符配合得很好。它们表示不需要使用线程的异步操作。在各种BCL类中都可以找到这样的示例,例如流
类、HttpClient
等。请注意,执行I/O绑定操作的大多数类都使用承诺式任务Task.Run
或Task.Factory.StartNew
。这将采用ThreadPool
线程并在内部执行提供的委托,除非您明确告诉它您希望它使用TaskCreationOptions.LongRunning
创建一个新线程async await
与任何可等待的一起使用。awaitable
是具有GetAwaiter
方法的任何类/结构,该方法返回实现INotifyCompletion
或ICriticalNotifyCompletion
接口的类型。你可以阅读更多关于async await的内容。你混合了两个不同的概念:异步编程和多任务。那么你能给我描述一下吗?或者给我任何链接,我可以在哪里找到比较。对不起,是从我的手机写信。这更像是您应该搜索建议的内容。这取决于TaskFactory
如何异步调用显式创建的任务。最常见的方法是使用线程池,但还有其他类型的任务工厂。。。WAlso,只有当您需要按顺序对一个或多个异步操作建模时,才最好使用wait
,这些操作完成后需要返回到特定的线程上下文。大多数情况下,这意味着从UI线程调用异步操作时。我不会说“异步操作不需要线程”,因为它们的回调必须发生在线程上,即使是原始线程;)但是,如果您使用某种begin/wait或其他类型显式调用回调,那么这种情况也会发生在线程上。但是是的,实际操作可能不是在线程上运行的。@Erik I ment实际操作本身不会消耗线程。当然,一旦完成,它必须调用IOCP。注意,我说了额外的线程以及。