.net 使用TaskCompletionSource并将泛型Type作为参数

t98cgbkg  于 2023-05-02  发布在  .NET
关注(0)|答案(1)|浏览(95)

我目前正在重构一些代码,其中有两个非常相似的方法。这两个方法都使用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;
有没有人能告诉我这是可能的,如果是的话,我做错了什么?

falq053o

falq053o1#

如果要使用泛型类型,则需要在方法或类中声明类型,即e:

public Task? DoSharedCode<T>(TaskCompletionSource<T> tcs){
    Task? taskToAwait = null;
    
    [...do shared code...]
    taskToAwait = tcs.Task;
    [...do shared code...]
    return taskToAwait;

}

但是如果您不使用任务的结果,为什么要为TaskCompletionSource使用不同的类型呢?在哪里设置任务完成来源结果?为什么要创建中间的taskToAwait而不是仅仅创建return tcs.Task?这个贴出来的例子对我来说没有多大意义。

相关问题