Я работаю над приведенным ниже кодом и стараюсь сделать это так быстро, как может быть.Выполняющий блокирующий шаблон
В основном метод execute вызывается каждый раз, когда событие запускается в системе. То, что я тестирую, это проверить, прошло ли количество минут, прошедших с момента последнего сокращения. Если x количество минут прошло, мы должны выполнить задачу.
Поскольку события могут быть вызваны из любого потока и происходят довольно быстро, я думал, что запуск задачи из стороны блокировки (хотя ее задача) будет лучше, чем наличие в замке.
У кого-нибудь есть отзывы о том, как это можно улучшить?
public class TriggerReduce
{
private readonly object _lock = new object();
private readonly int _autoReduceInterval = 5;
private DateTime _lastTriggered;
public void Execute(object sender, EventArgs e)
{
var currentTime = DateTime.Now;
if (currentTime.Subtract(_lastTriggered).Duration().TotalMinutes > _autoReduceInterval)
{
var shouldRun = false;
lock (_lock)
{
if (currentTime.Subtract(_lastTriggered).Duration().TotalMinutes > _autoReduceInterval)
{
_lastTriggered = currentTime;
shouldRun = true;
}
}
if (shouldRun)
{
Task.Factory.StartNew(() =>
{
//Trigger reduce which is a long running task
}, TaskCreationOptions.LongRunning);
}
}
}
}
Действительно ли это проблема производительности для вас? Разве это не преждевременная оптимизация? – svick
Вы можете быть правы, но его учебный акциз, как и все. Я хочу убедиться, что я понимаю, как все движущиеся части работают так же, как и все. –