2013-10-25 1 views
1

Я пытался общаться с SignalR ised и ASP.Net (VB) При работе работает отлично с первым пользователем, но логин с другим пользователем получает ошибку:Сигнал реального времени R в ошибке ASP.NET в .ContainsKey

Ошибка: Переполнение

Пожалуйста, помогите, я новичок с приложениями реального времени

Public Overrides Function OnConnected() As Task 
     Dim myRoomId = "XXXX" 
     Dim myUserId = IdentityUser.UserCode 
     SyncLock connections 
      If Not connections.ContainsKey(myRoomId) Then 
       connections(myRoomId) = New Dictionary(Of Integer, List(Of String))() 
      End If 
      If Not connections(myRoomId).ContainsKey(myUserId) Then ' <<<<<--- Error 
       connections(myRoomId)(myUserId) = New List(Of String)() 
      End If 
      connections(myRoomId)(myUserId).Add(Me.Context.ConnectionId) 
     End SyncLock 
     Return MyBase.OnConnected() 
End Function 

ответ

0

вы запирающий объектом «соединение» и пытаетесь изменить его в SyncLock, не допускаются.

Используйте пустой объект для блокировки в SyncLock, он должен быть общедоступным и общим. Кроме того, вы не должны использовать «OnConnect()» событие becuase будет срабатывать каждый раз по методе ступицы вызова

как это

Private Shared _lock_connections As New Object 

Public Overrides Function OnConnected() As Task 
Dim myRoomId = "XXXX" 
Dim myUserId = IdentityUser.UserCode 
SyncLock _lock_connections 
    If Not connections.ContainsKey(myRoomId) Then 
     connections(myRoomId) = New Dictionary(Of Integer, List(Of String))() 
    End If 
    If Not connections(myRoomId).ContainsKey(myUserId) Then ' <<<<<--- Error 
     connections(myRoomId)(myUserId) = New List(Of String)() 
    End If 
    connections(myRoomId)(myUserId).Add(Me.Context.ConnectionId) 
End SyncLock 
Return MyBase.OnConnected() 
End Function