我有一个负责检索资源的类,该类还缓存它们以便快速访问。
该类公开了用于检索资源的异步方法:
public Task<object> GetResourceAsync(string resourceName)
{
return Task.Factory.StartNew<object>(() =>
{
// look in cache
// if not found, get from disk
// return resource
});
}
客户端代码如下所示:
myResourceProvider.GetResourceAsync("myResource")
.ContinueWith<object>(t => Console.WriteLine("Got resource " + t.Result.ToString()));
这样,始终使用后台线程。但是,如果在缓存中找到该对象,我不希望代码异步运行。
如果在缓存中找到它,我想立即返回资源,而不必使用另一个线程。
Thanks.
.NET 4.5 有Task.FromResult http://msdn.microsoft.com/en-us/library/hh194922%28v=vs.110%29.aspx可以让你返回一个Task<T>
,但它不是在线程池线程上运行委托,而是显式设置任务的返回值。
所以在你的代码的上下文中:
public Task<object> AsyncGetResource(string resourceName)
{
object valueFromCache;
if (_myCache.TryGetValue(resourceName, out valueFromCache)) {
return Task.FromResult(valueFromCache);
}
return Task.Factory.StartNew<object>(() =>
{
// get from disk
// add to cache
// return resource
});
}
如果您仍在使用 .NET 4.0,则可以使用TaskCompletionSource<T> http://msdn.microsoft.com/en-us/library/dd449174.aspx做同样的事情:
var tcs = new TaskCompletionSource<object>();
tcs.SetResult(...item from cache...);
return tcs.Task;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)