C# TaskCompleteSource有两种不同的类型?

C# TaskCompleteSource有两种不同的类型?,c#,C#,我有ConcurrentDictionary,因此总结评论中的讨论,这个问题更多地与一种方法的泛化有关,这种方法允许使用适用于Task和Task案例的TaskCompletionSource。由于没有非通用的TaskCompletionSource实现,因此可以建议在两种情况下使用TaskCompletionSource实现有结果和无结果的任务。这是可能的,因为Task继承了Task,这允许返回更基本的类作为等待类。下面的示例说明了这一点: static Task<int>

我有
ConcurrentDictionary,因此总结评论中的讨论,这个问题更多地与一种方法的泛化有关,这种方法允许使用适用于
Task
Task
案例的
TaskCompletionSource
。由于没有非通用的
TaskCompletionSource
实现,因此可以建议在两种情况下使用
TaskCompletionSource
实现有结果和无结果的任务。这是可能的,因为
Task
继承了
Task
,这允许返回更基本的类作为等待类。下面的示例说明了这一点:

    static Task<int> WithResult()
    {
        var tcs = new TaskCompletionSource<int>();
        Task.Run(async () =>
        {
            await Task.Delay(1000);
            tcs.SetResult(2222);
        });
        return tcs.Task;
    }

    static Task WithNoResult()
    {
        var tcs = new TaskCompletionSource<int>();
        Task.Run(async () =>
        {
            await Task.Delay(1000);
            tcs.SetResult(default(int)); 
        });
        return tcs.Task;
    }

    static async Task InitiateTasks()
    {
        var result = await WithResult();
        Console.WriteLine(result);
        await WithNoResult();
        Console.WriteLine("No result");
    }
带有result()的静态任务
{
var tcs=new TaskCompletionSource();
Task.Run(异步()=>
{
等待任务。延迟(1000);
设置结果(2222);
});
返回tcs.Task;
}
带noresult()的静态任务
{
var tcs=new TaskCompletionSource();
Task.Run(异步()=>
{
等待任务。延迟(1000);
SetResult(默认值(int));
});
返回tcs.Task;
}
静态异步任务InitiateTasks()
{
var result=等待WithResult();
控制台写入线(结果);
用noresult()等待;
控制台。写入线(“无结果”);
}

可能是您可以提供一些代码来说明问题。为什么您需要
任务完成源代码
?因为在某些情况下,当我收到响应时,我应该只解决任务而不返回任何内容。为什么您不能对这两种情况都使用
任务完成源代码
?Task继承Task,所以您可以仅为不需要结果的情况公开Task。不可能在同一个字典中使用不同的值类型,除非您退回到
object
type,这是您不希望使用的选项。这就是例子。
TaskCompletionSource
用于
Task
Task
方法。
    static Task<int> WithResult()
    {
        var tcs = new TaskCompletionSource<int>();
        Task.Run(async () =>
        {
            await Task.Delay(1000);
            tcs.SetResult(2222);
        });
        return tcs.Task;
    }

    static Task WithNoResult()
    {
        var tcs = new TaskCompletionSource<int>();
        Task.Run(async () =>
        {
            await Task.Delay(1000);
            tcs.SetResult(default(int)); 
        });
        return tcs.Task;
    }

    static async Task InitiateTasks()
    {
        var result = await WithResult();
        Console.WriteLine(result);
        await WithNoResult();
        Console.WriteLine("No result");
    }