首页 > 解决方案 > 具有 2 种不同类型的 TaskCompleteSource?

问题描述

我有ConcurrentDictionary<string, TaskCompletionSource<SomeRandomClass>,但我遇到了字典应该能够添加的情况,TaskCompletionSource<Task>还有没有办法在没有单独的情况下做到这一点ConcurrentDictionary<string, TaskCompletionSource<Task>>?现在我正在使用 2Dictionaries但我正在考虑一种add and remove从两者的字典中获取的方法TaskCompletionSource?尝试使用TaskCompletionSource<Type>但似乎不起作用。

例子

private ConcurrentDictionary<string, TaskCompletionSource<TestClass>> directory = new ConcurrentDictionary<string, TaskCompletionSource<TestClass>>();

// first case
var task = new TaskCompletionSource<TestClass>();
var id = "2312-43d-asd-fsd-sda"
directory.TryAdd(id, task); // works

// second case
var task = new TaskCompletionSource<Task>();
var id = "321-23-sad-21-3-123";
directory.TryAdd(id, task); // doesn't work, different type

标签: c#

解决方案


因此,总结评论中的讨论,该问题更多地与一种方法的概括有关,该方法将允许使用TaskCompletionSource适用于Task<T>Task案例。由于没有非通用TaskCompletionSource实现作为可能的解决TaskCompletionSource<SomeClass>方案,因此可以建议在等待有结果和没有结果的任务的两种情况下使用。这是可能的,因为Task<T>继承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");
    }

推荐阅读