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");
}