c# - 具有 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
解决方案
因此,总结评论中的讨论,该问题更多地与一种方法的概括有关,该方法将允许使用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");
}
推荐阅读
- css - Bootstrap 4中不需要的导航栏透明度
- java - JUnit 测试 public boolean equals(Object obj)
- android - Android - 以编程方式创建的广播接收器导出
- .net - Azure 函数自定义类请求正文 - 无无参数构造函数/无效的强制转换字符串 -> guid
- hibernate - 如何使用 spring 验证器验证多个 POJO?
- php - PHP PDO 'SQLSTATE[HY093]:参数号无效:参数未定义
- javascript - 使用 VueJS 时挂载组件失败
- double - Android Studio 在 Operands.DOUBLE 上显示错误
- c#-4.0 - 在 BrightPearl API 上搜索订单
- sql-server - 使用 SSIS 将图像从 SQL Server 表导出到文件夹不起作用