generic <typename TResult>
public ref class Task : System::Threading::Tasks::Task
public class Task<TResult> : System.Threading.Tasks.Task
type Task<'Result> = class
inherit Task
Public Class Task(Of TResult)
Inherits Task
TResult
类
Task<TResult>
表示返回值且通常以异步方式执行的单个操作。
Task<TResult>
对象是.NET Framework 4 中首次引入
的基于任务的异步模式
的核心组件之一。 由于 对象执行
Task<TResult>
的工作通常在线程池线程上异步执行,而不是在main应用程序线程上同步执行,因此可以使用
Status
属性以及
IsCanceled
、
IsCompleted
和
IsFaulted
属性来确定任务的状态。 大多数情况下,lambda 表达式用于指定任务要执行的工作。
Task<TResult>
可以通过多种方式创建实例。 从 .NET Framework 4.5 开始,最常见的方法是调用静态
Task.Run<TResult>(Func<TResult>)
或
Task.Run<TResult>(Func<TResult>, CancellationToken)
方法。 这些方法提供了一种使用默认值启动任务的简单方法,无需获取其他参数。 以下示例使用
Task.Run<TResult>(Func<TResult>)
方法启动循环任务,然后显示循环迭代次数:
using System;
using System.Threading.Tasks;
public class Example
public static void Main()
var t = Task<int>.Run( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
return ctr;
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
// The example displays output like the following:
// Finished 1,000,001 loop iterations.
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t As Task(Of Integer) = Task.Run(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays the following output:
' Finished 1,000,001 loop iterations
在 .NET Framework 4 中启动任务的一种替代方法是调用静态
TaskFactory.StartNew
或
TaskFactory<TResult>.StartNew
方法。 属性
Task.Factory
返回 对象
TaskFactory
,属性
Task<TResult>.Factory
返回
TaskFactory<TResult>
对象。 其
StartNew
方法的重载允许传递参数、定义任务创建选项以及指定任务计划程序。 以下示例使用
TaskFactory<TResult>.StartNew(Func<TResult>)
方法启动任务。 它在功能上等效于上一示例中的代码。
using System;
using System.Threading.Tasks;
public class Example
public static void Main()
var t = Task<int>.Factory.StartNew( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
return ctr;
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t = Task(Of Integer).Factory.StartNew(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays output like the following:
' Finished 1,000,001 iterations
有关更完整的示例,请参阅
基于任务的异步编程
。
类
Task<TResult>
还提供用于初始化任务但不计划任务的构造函数以供执行。 出于性能原因,
Task.Run
和
Task.Factory.StartNew
方法是用于创建和计划计算任务的首选机制,但对于必须分离任务创建和计划的方案,可以使用构造函数,然后可以使用任务的
Start
方法来计划稍后执行的任务。
从面向 .NET Framework 4.6 的桌面应用开始,创建和调用任务的线程区域性将成为线程上下文的一部分。 也就是说,无论执行任务的线程的当前区域性如何,任务的当前区域性都是调用线程的区域性。 对于面向 .NET Framework 4.6 之前的 .NET Framework 版本的应用,任务的区域性是执行任务的线程的区域性。 有关详细信息,请参阅主题中的“区域性和基于任务的异步操作”部分
CultureInfo
。 请注意,应用商店应用遵循设置和获取默认区域性Windows 运行时。
对于不返回值的操作,请使用
Task
类。 从 C# 7.0 开始,对于作为值类型而不是引用类型的更轻量级的任务,请使用
System.Threading.Tasks.ValueTask<TResult>
结构。
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:
https://aka.ms/ContentUserFeedback
.
提交和查看相关反馈