給定一個包含GetData方法的類。其他幾個客戶端調用GetData,而不是每次都獲取數據,我想創建一個模式,第一個調用開始任務以獲取數據,其餘的調用等待任務完成。.net async/async異步數據獲取方法的正確模式
private Task<string> _data;
private async Task<string> _getdata()
{
return "my random data from the net"; //get_data_from_net()
}
public string GetData()
{
if(_data==null)
_data=_getdata();
_data.wait(); //are there not a problem here. cant wait a task that is already completed ? if(_data.status != rantocompletion) _data.wait() is not any better, it might complete between the check and the _data.wait?
return _data.Result;
}
我該如何正確地做模式?
(解決方案)
private static object _servertime_lock = new object();
private static Task<string> _servertime;
private static async Task<string> servertime()
{
try
{
var thetvdb = new HttpClient();
thetvdb.Timeout = TimeSpan.FromSeconds(5);
// var st = await thetvdb.GetStreamAsync("http://www.thetvdb.com/api/Updates.php?type=none");
var response = await thetvdb.GetAsync("http://www.thetvdb.com/api/Updates.php?type=none");
response.EnsureSuccessStatusCode();
Stream stream = await response.Content.ReadAsStreamAsync();
XDocument xdoc = XDocument.Load(stream);
return xdoc.Descendants("Time").First().Value;
}
catch
{
return null;
}
}
public static async Task<string> GetServerTime()
{
lock (_servertime_lock)
{
if (_servertime == null)
_servertime = servertime();
}
var time = await _servertime;
if (time == null)
_servertime = null;
return time;
}
我正在使用鎖定if(_data == null) _data = _getdata(); - 這足夠嗎?或者你可以舉一個懶惰班的例子。 (不熟悉它)。 –
鎖已足夠,但速度很慢。 http://msdn.microsoft.com/en-us/library/dd642331.aspx – SLaks
將我的解決方案更改爲使用Lazy很容易嗎? –