2009-05-19 3 views
1

List (TValue)와 같은 IEnumerable이 있다고 가정하고이 목록의 액세스 여부를 추적하고 싶습니다 (다른 스레드에서 반복되는 동안 목록에 추가하는 문제를 방지하기 위해) ; 나는 항상 다음과 같은 코드를 작성할 수 있습니다 :For Each 루프를 사용하여 IEnumerable에 액세스 중인지 확인하는 방법이 있습니까?

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 

(이 코드는 매우 임의 실현,하지만 무슨 말인지 보여줍니다.)

내 질문은 더 나은/청소기가 있는지 여부입니다 방법은 위와 같이 부울을 수동으로 업데이트하고 액세스하는 것보다이 검사를 수행하는 것입니다. 거기에 있어야하는 것처럼 느껴지지만 내 지식으로는 IEnumerable 클래스에는 내장 된 "나는 반복되고있다"라는 메서드 나 속성이 없습니다. 그리고 IEnumerable을 구현하고 그러한 속성을 포함하는 새로운 클래스를 작성하는 것은 나에게 잔인한 것처럼 보입니다.

답변

3

Afaik, VB.NET에서는 SyncLock을 사용하여 다른 스레드가 동시에 작업하지 못하도록 액세스하는 동안 객체 주위에 자물쇠를 배치 할 수 있습니다. 이 목록 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 
+0

고마워요! 전에 SyncLock에 익숙하지 않았습니다. 이제 호기심에서 벗어난이 시나리오에서 단순히 "SyncLock List1 ... End SyncLock"을 작성하는 대신이 새로운 objStorageLock 객체를 만드는 것이 어떻습니까? –

+0

신경 쓰지 마라. MSDN에서 내 자신의 질문에 대한 대답을 찾았습니다. "SyncLock 블록을 실행하는 동안 lockobject 값을 변경할 수 없습니다. 메커니즘을 사용하면 잠금 개체가 변경되지 않아야합니다." –

1

길을 가야하는 것입니다.

당신이 열거하는 동안 예외를 제거 후있는 후 사본을받을 수 있나요 그리고 분명히 같은

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

당신이 당신의 RAM의 사용 및 성능 등 등을 고려할 수 있음을 열거 때로는 더 나은 경우지만 일반적으로 이것은 잘 작동하고 매우 빠릅니다.

1

VB.net은 IEnumerable 인터페이스를 사용하는 것보다 GetEnumerator 함수가 적합한 경우 GetEnumerator 함수를 사용합니다. 따라서 IEnumerable을 구현할 수 있지만 IEnumerable.GetEnumerator를 구현하는 메소드에 다른 이름을 부여하십시오. 무언가를 열거하는 대부분의 다른 루틴은 오리 타입 GetEnumerator가 아닌 IEnumerable을 사용할 것이므로 GetEnumerator 메서드 자체가 호출된다는 사실은 for-each 루프에 의해 채택되고 있음을 암시합니다.

관련 문제