如何为TaskCompletionSource
而不是Task
创建Task<TResult>
?
答案 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
}
这里的主要优点是类型是最小的(最少浪费),并且类型不表示结果中包含“值”(如果消费者使用反射等)。