public static async Task<StatusModel> Get(TwitterStatus status)
{
return GetIfCacheIsAlive(status.Id) ?? await _loader.StartNew(async () =>
{
if (status.GenerateFromJson)
{
status = await StatusProxy.SyncStatusActivityAsync(status).ConfigureAwait(false);
}
var rto = status.RetweetedOriginal == null
? null
: await Get(status.RetweetedOriginal).ConfigureAwait(false);
var lockerobj = _generateLock.GetOrAdd(status.Id, new object());
try
{
lock (lockerobj)
{
StatusModel model;
WeakReference<StatusModel> wr;
_staticCache.TryGetValue(status.Id, out wr);
if (wr != null && wr.TryGetTarget(out model))
{
return model;
}
// cache is dead/not cached yet
model = new StatusModel(status, rto);
wr = new WeakReference<StatusModel>(model);
_staticCache[status.Id] = wr;
return model;
}
}
finally
{
_generateLock.TryRemove(status.Id, out lockerobj);
// ReSharper disable InvertIf
#pragma warning disable 4014
if (Interlocked.Increment(ref _cleanupCount) == CleanupInterval)
{
Interlocked.Exchange(ref _cleanupCount, 0);
Task.Run((Action)CollectGarbages);
}
#pragma warning restore 4014
// ReSharper restore InvertIf
}
}).Unwrap().ConfigureAwait(false);
}