Я пытаюсь реализовать функции стиля кометы, опрашивая сервер об изменениях данных и удерживая соединение открытым до тех пор, пока не появится что-то для ответа.
Во-первых, у меня есть статическая переменная на моем контроллере, в которой хранится время последнего обновления данных:
public static volatile DateTime lastUpdateTime = 0;
Поэтому всякий раз, когда данные, которые я опрашиваю, изменяются, эта переменная будет изменена.
Затем у меня есть действие, которое принимает последний раз, когда данные были получены в качестве параметра:
public ActionResult Push(DateTime lastViewTime)
{
while (lastUpdateTime <= lastViewTime)
{
System.Threading.Thread.Sleep(10000);
}
return Content("testing 1 2 3...");
}
Таким образом, если lastUpdateTime меньше или равно lastViewTime, мы знаем, что новых данных нет, и мы просто держим запрос в цикле, оставляя соединение открытым, пока не появится новая информация, которую мы могли бы затем отправить обратно в клиент, который обработает ответ, а затем сделает новый запрос, поэтому соединение практически всегда открыто.
Кажется, это работает нормально, но я беспокоюсь о безопасности потоков, это нормально? Нужно ли lastUpdateTime помечать как volatile? Есть ли способ лучше?
Спасибо
редактировать: возможно, мне следует использовать объект блокировки, когда я обновляю значение времени
private static object lastUpdateTimeLock = new object();
..
lock (lastUpdateTimeLock)
{
lastUpdateTime = DateTime.Now;
}