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