提交 d18adf68 编写于 作者: H Heejae Chang

PR feedback and added more places where it tracks last activity

上级 2f085529
......@@ -21,8 +21,24 @@ internal class AssetStorage
public static readonly AssetStorage Default =
new AssetStorage(cleanupInterval: TimeSpan.FromMinutes(1), purgeAfter: TimeSpan.FromMinutes(3), gcAfter: TimeSpan.FromMinutes(5));
/// <summary>
/// Time interval we check storage for cleanup
/// </summary>
private readonly TimeSpan _cleanupIntervalTimeSpan;
/// <summary>
/// Time span data can sit inside of cache (<see cref="_assets"/>) without being used.
/// after that, it will be removed from the cache.
/// </summary>
private readonly TimeSpan _purgeAfterTimeSpan;
/// <summary>
/// Time we will wait after the last activity before doing explicit GC cleanup.
/// We monitor all resource access and service call to track last activity time.
///
/// We do this since 64bit process can hold onto quite big unused memory when
/// OOP is running as AnyCpu
/// </summary>
private readonly TimeSpan _gcAfterTimeSpan;
private readonly ConcurrentDictionary<Checksum, Entry> _globalAssets =
......@@ -36,11 +52,17 @@ internal class AssetStorage
private volatile AssetSource _assetSource;
// constructor for testing
public AssetStorage()
{
// constructor for testing
}
/// <summary>
/// Create central data cache
/// </summary>
/// <param name="cleanupInterval">time interval to clean up</param>
/// <param name="purgeAfter">time unused data can sit in the cache</param>
/// <param name="gcAfter">time we wait before it call GC since last activity</param>
public AssetStorage(TimeSpan cleanupInterval, TimeSpan purgeAfter, TimeSpan gcAfter)
{
_cleanupIntervalTimeSpan = cleanupInterval;
......
......@@ -172,6 +172,8 @@ private static Task<Solution> GetSolutionAsync(RoslynServices roslynService, Pin
protected async Task<T> RunServiceAsync<T>(Func<Task<T>> callAsync, CancellationToken cancellationToken)
{
AssetStorage.UpdateLastActivityTime();
try
{
return await callAsync().ConfigureAwait(false);
......@@ -185,6 +187,8 @@ protected async Task<T> RunServiceAsync<T>(Func<Task<T>> callAsync, Cancellation
protected async Task RunServiceAsync(Func<Task> callAsync, CancellationToken cancellationToken)
{
AssetStorage.UpdateLastActivityTime();
try
{
await callAsync().ConfigureAwait(false);
......@@ -198,6 +202,8 @@ protected async Task RunServiceAsync(Func<Task> callAsync, CancellationToken can
protected T RunService<T>(Func<T> call, CancellationToken cancellationToken)
{
AssetStorage.UpdateLastActivityTime();
try
{
return call();
......@@ -211,6 +217,8 @@ protected T RunService<T>(Func<T> call, CancellationToken cancellationToken)
protected void RunService(Action call, CancellationToken cancellationToken)
{
AssetStorage.UpdateLastActivityTime();
try
{
call();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册