假设以下代码:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
Lazy<TimeSpan> lm = new Lazy<TimeSpan>(GetDataAsync1, System.Threading.LazyThreadSafetyMode.PublicationOnly);
return new string[] { "value1", "value2", lm.Value.ToString() };
}
private TimeSpan GetDataAsync1()
{
return GetTS().ConfigureAwait(false).GetAwaiter().GetResult();
}
// I Cant change this method, and what is inside it...
private async Task<TimeSpan> GetTS()
{
var sw = Stopwatch.StartNew();
using (var client = new HttpClient())
{
var result = await client.GetAsync("https://www.google.com/");
}
sw.Stop();
return sw.Elapsed;
}
}
我的问题是从远程服务器获取一些数据,并想要将其缓存以供以后使用。由于在某个点上远程服务器可能会失败,我不想缓存异常,而只想缓存成功的结果... 因此,对于我来说保持等待值的方式不可行。
// Cant use this, because this caches failed exception as well
Lazy<Task...> lz = ...
await lz.Value
但是上面的代码片段,如预期所示会导致死锁,鉴于我无法更改GetTS函数,是否有可能强制Lazy与我的逻辑一起工作?
Task
上调用GetResult()
。相反,应该使用await
。 - AlejandroLazy<T>
类的实现。 - Theodor Zoulias