C# 围绕现有对象创建任务包装器
我有一个方法,它返回一个任务,在这个任务中,实现可能需要也可能不需要执行缓慢的操作来检索结果。我希望能够简单地将结果值包装到一个任务中,在该值已经可用的情况下,该任务被标记为已同步完成。今天我有这样的事情:C# 围绕现有对象创建任务包装器,c#,task,task-parallel-library,C#,Task,Task Parallel Library,我有一个方法,它返回一个任务,在这个任务中,实现可能需要也可能不需要执行缓慢的操作来检索结果。我希望能够简单地将结果值包装到一个任务中,在该值已经可用的情况下,该任务被标记为已同步完成。今天我有这样的事情: public Task<Foo> GetFooAsync(int key) { lock(this) { if(_Cache.ContainsKey(key) ) { Task<Foo> ret = new Task<Foo>(()
public Task<Foo> GetFooAsync(int key) {
lock(this) {
if(_Cache.ContainsKey(key) ) {
Task<Foo> ret = new Task<Foo>(()=>_Cache[key]);
ret.RunSynchronously();
return ret;
}
else {
return Task.Factory.StartNew<Foo>(SomethingSlow());
}
}
}
公共任务GetFooAsync(int键){
锁(这个){
if(_Cache.ContainsKey(键)){
Task ret=新任务(()=>_Cache[key]);
ret.RunSynchronously();
返回ret;
}
否则{
返回Task.Factory.StartNew(SomethingSlow());
}
}
}
是否有一种更简单的方法可以做到这一点,即在我已经知道结果的情况下,不需要我使用委托构造任务?您可以使用:
var tcs=new TaskCompletionSource();
SetResult(_Cache[key]);
返回tcs.Task;
(请注意,如果
\u Cache
是一个字典
,则可以使用TryGetValue
进行单个查找。)如果有一个同步版本的方法返回结果,则可以执行以下操作
Task<String>(()=> Hello(Name));
从.NET 4.5开始,您可以使用静态方法来实现以下目的:
return Task.FromResult(_Cache[key]);
public String Hello(String Name)
{
return "Hello " + Name;
}
return Task.FromResult(_Cache[key]);