TaskCompletionSource for Task
本文关键字:Task for TaskCompletionSource | 更新日期: 2023-09-27 18:21:18
如何为Task
而不是Task<TResult>
创建TaskCompletionSource
?
没有非通用版本。但是,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
}
这里的主要优点是类型尽可能小(浪费最少),并且类型不表明结果中包含"值"(如果消费者确实使用了反射等)。