主页 > 游戏开发  > 

C#异步/多线程编程中Task对象强大的功能介绍。

C#异步/多线程编程中Task对象强大的功能介绍。

在 C# 的异步编程中,Task 是一个非常重要的类,它表示一个异步操作。Task 类提供了许多方法,用于管理、控制和组合异步操作。以下是 Task 类中一些常用方法的详细讲解及其功能。


1. Task.Run

功能:将指定的代码块调度到线程池中异步执行。

用途:用于在后台线程中执行 CPU 密集型操作。

示例:

csharp

Task.Run(() => { Console.WriteLine("This runs on a background thread."); });


2. Task.Delay

功能:创建一个在指定时间后完成的 Task。

用途:用于实现异步等待,比如模拟延迟或定时任务。

示例:

csharp

await Task.Delay(1000); // 等待 1 秒 Console.WriteLine("1 second has passed.");


3. Task.FromResult

功能:创建一个已经完成并返回指定结果的 Task<TResult>。

用途:用于同步方法中返回一个已完成的任务。

示例:

csharp

Task<int> task = Task.FromResult(42); Console.WriteLine(task.Result); // 输出: 42


4. Task.Wait

功能:阻塞当前线程,直到任务完成。

用途:用于同步等待任务完成(不推荐在异步代码中使用,可能导致死锁)。

示例:

csharp

Task task = Task.Run(() => Console.WriteLine("Task running.")); task.Wait(); // 阻塞,直到任务完成


5. Task.WaitAll

功能:阻塞当前线程,直到所有提供的任务完成。

用途:用于同步等待多个任务完成。

示例:

csharp

Task task1 = Task.Run(() => Console.WriteLine("Task 1")); Task task2 = Task.Run(() => Console.WriteLine("Task 2")); Task.WaitAll(task1, task2); // 等待所有任务完成


6. Task.WaitAny

功能:阻塞当前线程,直到任何一个提供的任务完成。

用途:用于同步等待多个任务中的任意一个完成。

示例:

csharp

Task task1 = Task.Run(() => Thread.Sleep(1000)); Task task2 = Task.Run(() => Thread.Sleep(500)); int completedTaskIndex = Task.WaitAny(task1, task2); // 返回第一个完成的任务的索引 Console.WriteLine($"Task {completedTaskIndex + 1} completed first.");


7. Task.WhenAll

功能:创建一个任务,该任务在所有提供的任务完成后完成。

用途:用于异步等待多个任务完成。

示例:

csharp

Task task1 = Task.Run(() => Console.WriteLine("Task 1")); Task task2 = Task.Run(() => Console.WriteLine("Task 2")); await Task.WhenAll(task1, task2); // 异步等待所有任务完成


8. Task.WhenAny

功能:创建一个任务,该任务在任何一个提供的任务完成后完成。

用途:用于异步等待多个任务中的任意一个完成。

示例:

csharp

Task task1 = Task.Run(() => Thread.Sleep(1000)); Task task2 = Task.Run(() => Thread.Sleep(500)); Task completedTask = await Task.WhenAny(task1, task2); // 返回第一个完成的任务 Console.WriteLine("A task has completed.");


9. Task.ContinueWith

功能:创建一个在任务完成后执行的任务。

用途:用于任务完成后执行额外的逻辑。

示例:

csharp

Task task = Task.Run(() => Console.WriteLine("Initial task.")); task.ContinueWith(t => Console.WriteLine("Continuation task."));


10. Task.ConfigureAwait

功能:配置任务的等待行为,决定是否回到原始上下文(如 UI 线程)。

用途:用于优化异步代码的性能,避免不必要的上下文切换。

示例:

csharp

await Task.Run(() => Console.WriteLine("Background task.")) .ConfigureAwait(false); // 不回到原始上下文


11. Task.Start

功能:启动一个任务。

用途:用于手动启动任务(通常与 Task 构造函数一起使用)。

示例:

csharp

Task task = new Task(() => Console.WriteLine("Task started.")); task.Start();


12. Task.RunSynchronously

功能:在当前线程上同步运行任务。

用途:用于强制任务在当前线程上执行。

示例:

csharp

Task task = new Task(() => Console.WriteLine("Running synchronously.")); task.RunSynchronously();


13. Task.Result

功能:获取任务的返回值(阻塞当前线程,直到任务完成)。

用途:用于同步获取任务的结果(不推荐在异步代码中使用,可能导致死锁)。

示例:

csharp

Task<int> task = Task.Run(() => 42); int result = task.Result; // 阻塞,直到任务完成 Console.WriteLine(result); // 输出: 42


14. Task.IsCompleted

功能:检查任务是否已完成。

用途:用于判断任务的状态。

示例:

csharp

Task task = Task.Run(() => Thread.Sleep(1000)); if (task.IsCompleted) { Console.WriteLine("Task is completed."); }


15. Task.IsFaulted 和 Task.Exception

功能:

IsFaulted:检查任务是否因异常而失败。

Exception:获取任务抛出的异常。

用途:用于处理任务中的异常。

示例:

csharp

Task task = Task.Run(() => throw new Exception("Task failed.")); if (task.IsFaulted) { Console.WriteLine($"Task failed: {task.Exception.Message}"); }


16. Task.IsCanceled

功能:检查任务是否被取消。

用途:用于判断任务是否因取消而结束。

示例:

csharp

CancellationTokenSource cts = new CancellationTokenSource(); Task task = Task.Run(() => { cts.Token.ThrowIfCancellationRequested(); }, cts.Token); cts.Cancel(); if (task.IsCanceled) { Console.WriteLine("Task was canceled."); }


总结 方法名功能描述适用场景Task.Run在后台线程中执行代码CPU 密集型操作Task.Delay创建一个延迟任务异步等待Task.FromResult创建一个已完成的任务同步方法中返回任务Task.Wait阻塞当前线程,直到任务完成同步等待任务完成Task.WaitAll阻塞当前线程,直到所有任务完成同步等待多个任务完成Task.WaitAny阻塞当前线程,直到任意一个任务完成同步等待多个任务中的任意一个完成Task.WhenAll异步等待所有任务完成异步等待多个任务完成Task.WhenAny异步等待任意一个任务完成异步等待多个任务中的任意一个完成Task.ContinueWith在任务完成后执行额外逻辑任务链式操作Task.ConfigureAwait配置任务的等待行为优化异步代码性能Task.Start启动任务手动启动任务Task.RunSynchronously在当前线程上同步运行任务强制任务在当前线程执行Task.Result获取任务的返回值同步获取任务结果Task.IsCompleted检查任务是否完成判断任务状态Task.IsFaulted检查任务是否因异常失败处理任务异常Task.IsCanceled检查任务是否被取消判断任务是否取消

通过合理使用这些方法,你可以更好地管理和控制异步任务,编写高效、可靠的异步代码。

标签:

C#异步/多线程编程中Task对象强大的功能介绍。由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C#异步/多线程编程中Task对象强大的功能介绍。