Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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# System.Threading.Task何时有用?_C#_Multithreading_Parallel Processing_Task Parallel Library_Task - Fatal编程技术网

C# System.Threading.Task何时有用?

C# System.Threading.Task何时有用?,c#,multithreading,parallel-processing,task-parallel-library,task,C#,Multithreading,Parallel Processing,Task Parallel Library,Task,我已经广泛使用了大多数线程库。我非常熟悉创建新线程、创建BackgroundWorkers和使用内置的.NET线程池(这些都很酷) 然而,我从未找到使用该类的理由。我见过一两个使用它们的人的例子,但是这些例子不是很清楚,他们没有给出一个关于为什么应该使用任务而不是新线程的高层次概述 问题1:从高层来看,在.NET中使用任务与其他并行方法相比,什么时候有用 问题2:是否有人有一个简单和/或中等难度的例子来演示如何使用任务?使用任务有两个主要优点: 任务可以表示将来可用的任何结果(一般概念不是.Ne

我已经广泛使用了大多数线程库。我非常熟悉创建新线程、创建BackgroundWorkers和使用内置的.NET线程池(这些都很酷)

然而,我从未找到使用该类的理由。我见过一两个使用它们的人的例子,但是这些例子不是很清楚,他们没有给出一个关于为什么应该使用任务而不是新线程的高层次概述

问题1:从高层来看,在.NET中使用任务与其他并行方法相比,什么时候有用


问题2:是否有人有一个简单和/或中等难度的例子来演示如何使用任务?

使用
任务有两个主要优点:

  • 任务
    可以表示将来可用的任何结果(一般概念不是.Net特有的,它被称为),而不仅仅是计算。这对于
    async
    -
    await
    尤其重要,它使用
    Task
    s进行异步操作。由于获取结果的操作可能会失败,
    Task
    s也可以表示失败
  • Task
    有很多方法可以对其进行操作。您可以同步等待直到它完成(
    wait()
    ),等待它的结果(
    result
    ),在
    任务完成时设置一些操作(
    ContinueWith()
    ),以及在多个
    任务上工作的一些方法(
    watall()
    WaitAny()
    continuewheall()
    )。所有这些都可以使用其他并行处理方法实现,但您必须手动完成
  • 使用
    任务
    还有一些较小的优势:

  • 您可以使用自定义的
    TaskScheduler
    来决定任务运行的时间和地点。这可能很有用,例如,如果您愿意,或者
  • 任务
    s通过支持协同取消
  • 表示计算的任务有一些性能改进。例如,它们使用工作窃取队列进行更高效的处理,并且还支持内联(在同步等待任务的线程上执行尚未启动的任务)

  • 任务往往更易于使用,特别是当您将其视为尚未完成的工作的承诺时。任务(和TPL)允许通过[a]同步操作进行进一步抽象。已经有了IAsyncResult接口(它通常由BeginXYZ/EndXYZ使用,由Task使用),但使用起来有点笨拙。Task类提供了一种通用的“反转”技术;任务可以执行“正常”代码,而不是创建新的IAsyncResult类型。我认为你的问题2不适合这样做。@William我不确定,但我认为“给我看一个X的例子”实际上不是一个问题,所以它不属于像这样的问答。@svick-我知道这个问题不是很具体,但在这种情况下,我知道可能有一些东西需要学习,但我不确定如何正确提问。我认为你下面的答案是完美的+回答得很好。但是,我认为“小×1”是一个主要的优势,用“特定”代替“习惯”。有两个常用的内置任务调度器,一个用于可以在任何线程池线程上运行的后台任务,另一个用于必须在特定同步上下文(例如UI线程)中运行的代码。第二点:你不需要编写一个自定义的调度程序,这个特性就会有用。要点1:同一个模型可以用于未来工作的前台和后台单元,这是一个巨大的好处。这是一个用简单明了的英语回答的复杂概念,干杯!