如何使用泛型TaskCompletionSource重构重复异步代码?
问题:重构TaskCompletionSource泛型共享方法时遇到CS1503错误
我正在重构两段高度相似的代码,分别使用TaskCompletionSource<bool>和TaskCompletionSource<string>。两段代码都包含读取对应TaskCompletionSource的Task并等待的逻辑,希望将这部分共享代码重构为可接收泛型TaskCompletionSource参数的方法以减少冗余,但尝试的代码触发了CS1503错误,想知道是否可行及错误原因。
简化示例代码
public void BoolMethod(){ TaskCompletionSource<bool> boolTCS = new TaskCompletionSource<bool>(); Task? taskToAwait = null; [...do shared code...] taskToAwait = boolTCS.Task; [...do shared code...] await taskToAwait; [...do method specific code...] } public void StringMethod(){ TaskCompletionSource<string> stringTCS = new TaskCompletionSource<string>(); Task? taskToAwait = null; [...do shared code...] taskToAwait = stringTCS.Task; [...do shared code...] await taskToAwait; [...do method specific code...] }
我的尝试代码
public Task? DoSharedCode(TaskCompletionSource<T> tcs){ Task? taskToAwait = null; [...do shared code...] taskToAwait = tcs.Task; [...do shared code...] return taskToAwait; } public void StringMethod(){ TaskCompletionSource<string> stringTCS = new TaskCompletionSource<string>(); await DoSharedCode(stringTCS); [...do method specific code...] }
错误原因及可行性分析
错误原因
- 泛型参数未声明:
DoSharedCode方法中使用了TaskCompletionSource<T>,但未在方法签名中声明泛型参数<T>,编译器无法识别T的类型,导致参数类型无效,触发CS1503错误。 - 异步方法返回值违规:原
BoolMethod和StringMethod标记为void但内部使用了await,不符合C#异步方法规则——异步方法必须返回Task或Task<T>。
可行性结论
完全可行,只需修正上述两个问题即可实现泛型共享方法的重构。
修正后的代码示例
// 声明泛型方法,<T>为泛型参数 public Task DoSharedCode<T>(TaskCompletionSource<T> tcs) { Task taskToAwait = tcs.Task; [...执行共享代码...] return taskToAwait; } // 修正异步方法返回值为Task public async Task BoolMethod() { TaskCompletionSource<bool> boolTCS = new TaskCompletionSource<bool>(); await DoSharedCode(boolTCS); [...执行方法特定代码...] } public async Task StringMethod() { TaskCompletionSource<string> stringTCS = new TaskCompletionSource<string>(); await DoSharedCode(stringTCS); [...执行方法特定代码...] }
补充说明:TaskCompletionSource<T>.Task的类型是Task<T>,而Task<T>继承自Task,因此泛型方法返回Task是安全的,外部可直接await。
内容的提问来源于stack exchange,提问作者Sigmarod
相关产品推荐
相关产品推荐

