Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程、任务和异步/等待关键字之间的区别_C#_.net_Task Parallel Library_Async Await - Fatal编程技术网

C# 线程、任务和异步/等待关键字之间的区别

C# 线程、任务和异步/等待关键字之间的区别,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,最后几天我尝试在.NET中学习多任务处理。对此我没有什么问题。 首先我知道在.NET中存在一个名为“ThreadPool”的东西,所以如果我们用thread类创建新线程,我们使用ThreadPool中的thread还是创建新线程 任务库呢。在msdn中我们可以读到:“表示异步操作。”但是创建新线程和使用异步是两种不同的方式,对吗?所以,如果我们使用任务库,我们是创建异步操作还是创建新线程 如果是,那么何时应该使用async/await关键字? 上述方法的区别在哪里?让我们尝试打断每个问题: 所以

最后几天我尝试在.NET中学习多任务处理。对此我没有什么问题。 首先我知道在.NET中存在一个名为“ThreadPool”的东西,所以如果我们用thread类创建新线程,我们使用ThreadPool中的thread还是创建新线程

任务库呢。在msdn中我们可以读到:“表示异步操作。”但是创建新线程和使用异步是两种不同的方式,对吗?所以,如果我们使用任务库,我们是创建异步操作还是创建新线程

如果是,那么何时应该使用async/await关键字?
上述方法的区别在哪里?

让我们尝试打断每个问题:

所以,如果我们使用thread类创建新线程,我们将使用thread from 线程池还是创建新的线程池

ThreadPool
按照其名称所示,它是一个线程池。当您使用
线程
类时,您正在创建一个新的线程,与
线程池
中存在的线程无关

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

对。执行异步操作并不意味着“创建一个新线程并在该线程上工作”。我的意思是,这是并行的。异步操作通常在整个过程中进行,它们自然是异步的,一直到操作系统

所以,如果我们使用任务库,我们将创建异步操作或创建新的 线

您可以同时执行以下两项操作:

  • Promise风格的任务—这些任务与C#5中引入的
    async await
    操作符配合得很好。它们表示不需要使用线程的异步操作。在各种BCL类中都可以找到这样的示例,例如
    类、
    HttpClient
    等。请注意,执行I/O绑定操作的大多数类都使用承诺式任务

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

  • 如果是,那么何时应该使用async/await关键字


    async await
    与任何可等待的
    一起使用。
    awaitable
    是具有
    GetAwaiter
    方法的任何类/结构,该方法返回实现
    INotifyCompletion
    ICriticalNotifyCompletion
    接口的类型。你可以阅读更多关于async await的内容。你混合了两个不同的概念:异步编程和多任务。那么你能给我描述一下吗?或者给我任何链接,我可以在哪里找到比较。对不起,是从我的手机写信。这更像是您应该搜索建议的内容。这取决于
    TaskFactory
    如何异步调用显式创建的任务。最常见的方法是使用线程池,但还有其他类型的任务工厂。。。WAlso,只有当您需要按顺序对一个或多个异步操作建模时,才最好使用
    wait
    ,这些操作完成后需要返回到特定的线程上下文。大多数情况下,这意味着从UI线程调用异步操作时。我不会说“异步操作不需要线程”,因为它们的回调必须发生在线程上,即使是原始线程;)但是,如果您使用某种begin/wait或其他类型显式调用回调,那么这种情况也会发生在线程上。但是是的,实际操作可能不是在线程上运行的。@Erik I ment实际操作本身不会消耗线程。当然,一旦完成,它必须调用IOCP。注意,我说了额外的线程以及。