.NET 9 中的 TaskCompletionSource.SetFromTask

💡 原文中文,约3600字,阅读约需9分钟。
📝

内容提要

.NET 9 Preview 1 引入了 TaskCompletionSource/TaskCompletionSource<T> 中的 SetFromTask 方法,允许设置已完成任务的结果/状态。提供了在 Task.Delay 完成后设置 TaskCompletionSource、从 Task.FromResult 设置 TaskCompletionSource、处理已取消的任务、处理带有异常的任务,以及使用 TrySetFromTask 避免在 TaskCompletionSource 已经设置后再次设置时出现异常的示例。TaskCompletionSource 对于自定义任务非常有用。

🎯

关键要点

  • .NET 9 Preview 1 引入了 TaskCompletionSource/TaskCompletionSource<T> 的 SetFromTask 和 TrySetFromTask 方法。
  • SetFromTask 方法允许从已完成的任务设置 TaskCompletionSource 的结果或状态。
  • 提供了多个示例,包括在 Task.Delay 完成后设置 TaskCompletionSource 和从 Task.FromResult 设置 TaskCompletionSource。
  • 处理已取消的任务时,TaskCompletionSource 的状态会变为 Cancelled。
  • 处理带有异常的任务时,可以使用 .ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing) 来避免抛出异常。
  • 在 TaskCompletionSource 已经设置结果后,不能再次设置,否则会引发异常,可以使用 TrySetFromTask 避免此问题。
  • TaskCompletionSource 对于自定义任务非常有用。

延伸问答

.NET 9 中的 TaskCompletionSource.SetFromTask 方法有什么新特性?

SetFromTask 方法允许从已完成的任务设置 TaskCompletionSource 的结果或状态,并引入了 TrySetFromTask 方法以避免重复设置引发异常。

如何使用 SetFromTask 方法设置 TaskCompletionSource 的状态?

可以通过调用 tcs.SetFromTask(completedTask) 来设置 TaskCompletionSource 的状态,其中 completedTask 是已完成的任务。

TaskCompletionSource 如何处理已取消的任务?

当任务被取消时,TaskCompletionSource 的状态会变为 Cancelled,反映任务的取消状态。

在处理异常任务时,如何避免抛出异常?

可以使用 .ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing) 来等待任务结束而不抛出异常。

如果 TaskCompletionSource 已经设置了结果,如何避免再次设置时引发异常?

可以使用 TrySetFromTask 方法来尝试设置,如果已经设置则返回 false,而不会抛出异常。

TaskCompletionSource 在自定义任务中有什么用处?

TaskCompletionSource 对于需要自定义任务的场景非常有用,可以帮助包装和管理任务的状态。

➡️

继续阅读