var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;
var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );
Модульное тестирование, безусловно, будет трудным.
Все это можно достаточно просто сделать с помощью «собственных» механизмов параллелизма в .NET: операторов блокировки и Monitor.Wait
/Monitor.PulseAll
. Если у вас нет отдельного монитора для каждого элемента, вам нужно будет будить все потоки всякий раз, когда что-то будет удалено - иначе вы не сможете указать «правильному» потоку проснуться.
Если он на самом деле это просто набор элементов, кстати, вы можете использовать HashSet
вместо List
для представления коллекции - ничего из того, что вы упомянули, не имеет отношения к порядку.
Пример кода, предполагающий, что вам подходит набор:
using System;
using System.Collections.Generic;
using System.Threading;
public class LockCollection<T>
{
private readonly HashSet<T> items = new HashSet<T>();
private readonly object padlock = new object();
public bool Contains(T item)
{
lock (padlock)
{
return items.Contains(item);
}
}
public bool Add(T item)
{
lock (padlock)
{
// HashSet<T>.Add does what you want already :)
// Note that it will return true if the item
// *was* added (i.e. !Contains(item))
return items.Add(item);
}
}
public void WaitForNonExistence(T item)
{
lock (padlock)
{
while (items.Contains(item))
{
Monitor.Wait(padlock);
}
}
}
public void WaitForAndAdd(T item)
{
lock (padlock)
{
WaitForNonExistence(item);
items.Add(item);
}
}
public void Remove(T item)
{
lock (padlock)
{
if (items.Remove(item))
{
Monitor.PulseAll(padlock);
}
}
}
}
(Совершенно непроверенный, по общему признанию.
Существует продукт для поиска условий гонки и т.п. в модульных тестах. Он называется TypeMock Racer . Однако я не могу ничего сказать за или против его эффективности. :)
Хотя №1 может быть самым простым для написания, по сути, это бесполезный метод. Если вы не удерживаете ту же самую блокировку после завершения запроса на «существование записи», вы фактически возвращаете «существование записи в какой-то момент в прошлом». Он не дает вам никакой информации о текущем существовании записи.
Между обнаружением значения в списке и выполнением любой операции по извлечению, удалению значения, другой поток может прийти и удалить его за вас.
Содержит операции с параллельным списком, которые должны быть объединены с операцией, которую вы планируете выполнять в случае существования этой проверки истинно / ложно. Например, TestAdd () или TestRemove () намного безопаснее, чем Contains + Add или Contains + Remove