Я пытаюсь реализовать функции стиля кометы, опрашивая сервер на предмет изменений в данных и удерживая соединение открытым, пока не будет ответа.
Во-первых, у меня есть статическая переменная на контроллере, которая хранит время последнего обновления данных:
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? Есть ли лучший способ?
Спасибо
edit: возможно, мне следует использовать объект блокировки при обновлении значения времени
private static object lastUpdateTimeLock = new object();
..
lock (lastUpdateTimeLock)
{
lastUpdateTime = DateTime.Now;
}