C# параллельные вопросы о списке

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 );
8
задан wonea 24 September 2018 в 13:09
поделиться

3 ответа

Модульное тестирование, безусловно, будет трудным.

Все это можно достаточно просто сделать с помощью «собственных» механизмов параллелизма в .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);
            }
        }
    }
}

(Совершенно непроверенный, по общему признанию.

8
ответ дан 5 December 2019 в 08:54
поделиться

Существует продукт для поиска условий гонки и т.п. в модульных тестах. Он называется TypeMock Racer . Однако я не могу ничего сказать за или против его эффективности. :)

1
ответ дан 5 December 2019 в 08:54
поделиться

Хотя №1 может быть самым простым для написания, по сути, это бесполезный метод. Если вы не удерживаете ту же самую блокировку после завершения запроса на «существование записи», вы фактически возвращаете «существование записи в какой-то момент в прошлом». Он не дает вам никакой информации о текущем существовании записи.

Между обнаружением значения в списке и выполнением любой операции по извлечению, удалению значения, другой поток может прийти и удалить его за вас.

Содержит операции с параллельным списком, которые должны быть объединены с операцией, которую вы планируете выполнять в случае существования этой проверки истинно / ложно. Например, TestAdd () или TestRemove () намного безопаснее, чем Contains + Add или Contains + Remove

8
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: