TaskCompletionSource for Task

时间:2013-07-05 19:57:53

标签: c# async-await

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

1 个答案:

答案 0 :(得分: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
}

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