Я размещаю веб-приложение в сборке Azure на классическом ASP.NET (4.6.1).Моя проблема заключается в увеличении использования процессора и памяти.
Приложение - это API, который используется приложением.При нажатии мы достигли диапазона от 100 до 3000 пользователей в секунду в течение не менее 2-5 секунд.
После получения полной пробной версии для дампов и dotMemory я вижу следующую картину.
У меня есть два класса, записывающих данные в мой механизм таймера.
Статистика
public sealed class Statistics : IStatistics, IDisposable
{
private static Lazy<Statistics> _lazy => new Lazy<Statistics>(() => new Statistics());
public static Statistics Instance => Statistics._lazy.Value;
private readonly object _mutex = new object();
private readonly IDictionary<string, LogObject> _cache;
private readonly TimeSpan _interval;
private readonly Task _outputTask;
private readonly CancellationTokenSource _cancellationTokenSource;
private Statistics()
{
this._interval = TimeSpan.FromSeconds(15);
this._cache = new Dictionary<string, LogObject>();
this._cancellationTokenSource = new CancellationTokenSource();
this._outputTask = Task.Factory.StartNew(
this.WriteToRedis,
null,
TaskCreationOptions.LongRunning
);
}
private void Stop()
{
this._cancellationTokenSource.Cancel();
try
{
this._outputTask.Wait(this._interval);
}
catch (TaskCanceledException)
{
}
catch (AggregateException ex) when (ex.InnerExceptions.Count == 1 && ex.InnerExceptions[0] is TaskCanceledException)
{
}
this._cancellationTokenSource?.Dispose();
}
private static Task IntervalAsync(TimeSpan interval, CancellationToken cancellationToken)
=> Task.Delay(interval, cancellationToken);
public async Task WriteToRedis(object state)
{
while (!this._cancellationTokenSource.IsCancellationRequested)
{
// write stuff to redis in azure
await IntervalAsync(this._interval, this._cancellationTokenSource.Token);
}
}
public Task ReportQuery(string query, string data)
{
// save data to local cache
}
public void Dispose()
=> this.Stop();
}
ВторойЯ использую ту же самую механику для локального класса кэша, который содержит словарь.Таймер очищает словарные ключи для истечения установленного срока, если таковой установлен.
У кого-нибудь есть идея, почему объект TimerQueueTimer увеличивается на эту величину?Я что-нибудь пропустил?
Заранее спасибо