2

如何TaskCompletionSource为 aTask而不是 a 创建一个Task<TResult>

4

1 回答 1

4

没有非通用版本。但是,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
}

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

于 2013-07-05T20:00:05.793 回答