Есть ли способ, чтобы проверить, если IEnumerable осуществляется доступ с использованием для каждого цикла?

голоса
1

Предположим, у меня есть IEnumerable такие как List (TValue), и я хочу, чтобы отслеживать является ли доступ в этот список (для предотвращения проблем с, скажем, добавив к списку во время его итерации в другом потоке); Я всегда могу писать код, такой как:

Dim List1 As New List(Of Integer)
Dim IteratingList1 As Boolean = False

' ... some code ... '

Private Function getSumOfPositivesFromList1() As Integer
    If IteratingList1 Then Return -1

    IteratingList1 = True

    Dim SumOfPositives As Integer = 0

    For Each x As Integer In List1
        If x > 0 Then SumOfPositives += x
    Next

    IteratingList1 = False

    Return SumOfPositives
End Function

(Я понимаю, что этот код очень произвольно, но это показывает, что я имею в виду.)

Мой вопрос, есть ли лучше / уборщик способ выполнить эту проверку, чем вручную обновление и доступ к Boolean, как указано выше. Я чувствую, что должно быть, но, насколько мне известно, не существует какой-либо IEnumerable класса с встроенным «Я итерируемая над» метода или свойства. И писать новый класс, который реализует IEnumerable и содержит такое свойство кажется излишним для меня.

Задан 19/05/2009 в 12:30
источник пользователем
На других языках...                            


3 ответов

голоса
3

AFAIK, в VB.NET вы можете использовать , SyncLockчтобы поместить блокировку вокруг объекта , а доступ к нему, чтобы помешать другим потокам одновременно работать над ней.

Public Shared objStorageLock As New Object

Private Function getSumOfPositivesFromList1() As Integer

    Dim SumOfPositives As Integer = 0

    SyncLock objStorageLock 

    For Each x As Integer In List1
        If x > 0 Then SumOfPositives += x
    Next

    End SyncLock

    Return SumOfPositives
End Function
Ответил 19/05/2009 в 12:32
источник пользователем

голоса
1

Это зависит от того, что вы делаете, если вы беспокоитесь о множественном доступе на записи в список Synclockявляется путем.

Если вы после устранения исключений во время перечисления, то иногда лучше сделать, чтобы получить копию и перечислить, что такие, как

For Each Num as Integer in SumOfPositives.ToArray()
...
Next Num

Очевидно, что вы могли бы хотеть рассмотреть ваше использование оперативной памяти и производительности и т.д. и т.п., но в целом это работает отлично и довольно быстро.

Ответил 19/05/2009 в 12:37
источник пользователем

голоса
1

VB.net будет использовать функцию GetEnumerator, если подходящий таковой существует, в предпочтении к использованию IEnumerable интерфейса. Таким образом, можно было бы реализовать IEnumerable, но назвать дать метод, реализующий IEnumerable.GetEnumerator другое имя. Поскольку большинство других подпрограмм, которые будут перечислять что-то будет использовать IEnumerable, а не утка набрав GetEnumerator, тот факт, что сам метод GetEnumerator вызывается, предположил бы, что это время нанят для-каждого цикла.

Ответил 01/02/2011 в 14:45
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more