TaskCompletionSource for Task

本文关键字:Task for TaskCompletionSource | 更新日期: 2023-09-27 18:21:18

如何为Task而不是Task<TResult>创建TaskCompletionSource

TaskCompletionSource for Task

没有非通用版本。但是,Task<T>是从Task派生而来的,所以您可以只使用TaskCompletionSource<bool>并返回任务。

Task SomeMethodAsync()
{
    var tcs = new TaskCompletionSource<bool>();
    // Implement method as needed
    return tcs.Task; // Return the Task<bool> as a Task
}

注意,我使用bool只是因为它是一个小值类型,结果会被"丢弃"。这里的另一个选项是制作自己的自定义类型并返回,即:

private struct EmptyType {}
Task SomeMethodAsync()
{
    var tcs = new TaskCompletionSource<EmptyType>();
    // Implement method as needed
    // Use tcs.SetResult(default(EmptyType)) or similar
    return tcs.Task; // Return the Task<bool> as a Task
}

这里的主要优点是类型尽可能小(浪费最少),并且类型不表明结果中包含"值"(如果消费者确实使用了反射等)。