2014-11-12 2 views
1

나는이 작은 기능을 발견했지만 제대로 호출하려고 노력하고 있습니다. 어떻게 내 ConcurrentDictionary를 업데이트하기 위해 호출 할 수 있습니다차원 동시 사전 업데이트

Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim Animals As New Concurrent.ConcurrentDictionary(Of String, String()) 
     Dim iKey = "key123456" 

     Animals(iKey) = {"cat", "dog", "bird"} 

     Dim success As Boolean = TryUpdate(Animals, iKey, Func("cat", "frog")) 
    End Sub 

    Function TryUpdate(Of TKey, TValue)(dict As Concurrent.ConcurrentDictionary(Of TKey, TValue), key As TKey, updateFactory As Func(Of TValue, TValue)) As Boolean 
     Dim curValue As TValue 
     If Not dict.TryGetValue(key, curValue) Then 
      Return False 
     End If 
     dict.TryUpdate(key, updateFactory(curValue), curValue) 
     Return True 
    End Function 
End Class 
+0

TryUpdate 대신 'AddOrUpdate'를 사용할 수 있습니다. TryGetValue를 실행 한 다음 TryUpdate를 실행하면 동시성 문제가 발생할 수 있습니다. 즉, 검사를 수행 할 때 값이 존재하지 않을 수 있지만 다른 스레드에서 TryUpdate를 수행하면 값이 사라질 수 있습니다. – Neolisk

답변

2

TryUpdate는 세 개의 매개 변수,

  1. ConcurrentDictionary 업데이트 할,
  2. 키 사전에 업데이트하고,
  3. 있다 키의 현재 값을 받아들이고 원하는 값을 반환하는 델리게이트 함수.

    Dim success As Boolean = TryUpdate(myDictionary, myKey, Func(oldval) newval) 
    
당신은 세 번째 매개 변수는 당신에게 달려 통과하는 방법,하지만 의도는 다음 통과, 당신은 당신이 기대했던 보장하기 위해 이전 값을 살펴 가질 수 있도록처럼 보이는 중 당신을 새 값 또는 그에 따라 반환 된 값입니다. 선명도


추가 : 세 번째 매개 변수는 변경하려고하는 키의 현재 값을 적용하고 새로운 값을 반환하는 함수 (또는 원래 값으로 대리자를 통과 할 것으로 예상되고, 당신이 그것을 바꾸고 싶지 않으면).

여기에서 이전 값이 예상 한 값인지 확인한 다음 새 값을 반환하는 함수 CheckValue을 만듭니다. myDel은 해당 함수의 대리자이며 TryUpdate에 전달됩니다.

Dim whatIExpected As String = "" 
Dim newVal As String = "" 
Dim myDel As Func(Of String, String) = AddressOf CheckValue 
Public Function CheckValue(ByVal oldVal As String) As String 
    If (oldVal = whatIExpected) Then 
     Return newVal 
    Else 
     Return oldVal 
    End If 
End Function 

'Then later inside some function or sub.. 
whatIExpected = "cat" 
newVal = "frog" 
Dim success As Boolean = TryUpdate(myDictionary, myKey, myDel) 
+0

질문을 업데이트했지만 코드가 작동하지 않습니다. – PaulWill

+0

설명을 보려면 [Lambda Expressions] (http://msdn.microsoft.com/en-us/library/bb531253.aspx)를 참조하십시오. –

+0

귀하의 코드를 시도하고 컴파일 실 거예요 – PaulWill