TaskCompleteSource有2种不同类型?

时间:2018-09-01 11:08:51

标签: c#

我有ConcurrentDictionary<string, TaskCompletionSource<SomeRandomClass>,但是在字典应该也可以添加TaskCompletionSource<Task>的情况下,有没有没有单独的ConcurrentDictionary<string, TaskCompletionSource<Task>>的方法呢?现在我正在使用2 Dictionaries,但是我正在考虑从两个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

1 个答案:

答案 0 :(得分:2)

因此,总结评论中的讨论,该问题与方法的一般化有关,该方法将允许使用适用于TaskCompletionSourceTask<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");
    }