我目前正在重构一些代码,其中有两个非常相似的方法。这两个方法都使用TaskCompletionSource,其中一边是bool,另一边是字符串。
现在这两个方法都有一些代码来读取各自TaskCompletionSource的Task并在之后等待它。
有没有一种方法可以将这个codebit重构为一个方法,在这个方法中,我可以将TaskCompletionSource作为一个带有泛型Type的参数传递,这样我就可以在两个方法中使用它,从而减少我的代码?
简化的示例代码:
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...]
}
这给了我一个Error CS1503;
有没有人能告诉我这是可能的,如果是的话,我做错了什么?
1条答案
按热度按时间falq053o1#
如果要使用泛型类型,则需要在方法或类中声明类型,即e:
但是如果您不使用任务的结果,为什么要为
TaskCompletionSource
使用不同的类型呢?在哪里设置任务完成来源结果?为什么要创建中间的taskToAwait
而不是仅仅创建return tcs.Task
?这个贴出来的例子对我来说没有多大意义。