2013-10-10 3 views
0

SignalR을 사용하고 있습니다. 대화가 끝나면 모든 수신자를 대화에 추가하려고합니다.SignalR and Groups.Add in foreach

모든 코드가 좋지만 첫 번째 수신자에게만 알립니다. 그래서 방송이 처음

public void NotifyConversation(ConversationModel model, string name) 
{ 
    var groupId = model.ID.ToString(); 
    var recipients = model.Recipients; 
    var allconnections = new List<string>(); 


    foreach (var recipient in recipients) 
    { 
     var connections = _manager.GetConnections(recipient.Name).Where(x => x != null); 
     allconnections.AddRange(connections); 
    } 

    var tasks = allconnections 
     .Select(connection => 
       Task.Run(() => { Context.Groups.Add(connection, groupId); })).ToArray(); 

    Task.WaitAll(tasks); 

    Context.Clients.Group(groupId).broadcastConversation(model); 
} 

답변

0

비동기 Groups.Add입니다 만 기다리고 가정합니다. Groups.Add를 실행하는 작업을 만들고 있지만 작업의 내부 부분이 groups.add가 완료 될 때까지 기다리지 않기 때문에 거의 즉시 완료됩니다.

그러므로 groups.Add가 Task.Run 내부에서 완료 될 때까지 기다려야합니다. 같은

뭔가 :

var tasks = allconnections 
    .Select(connection => 
      Task.Run(() => { Context.Groups.Add(connection, groupId).Wait(); })).ToArray(); 
+0

어떤 이유인지 그것은 나를 위해 작동하지 않습니다 ... –

1

Add()는 비동기 : 그것은 Task을 반환합니다. Task.Run()이 이해,하지만 당신은 그것에 Task이 (람다가 블록에 더 이상 알 수 없음) 것을 반환해야하기 때문에,

Task.Run(() => Context.Groups.Add(connection, groupId)) 

이 그것이 더 나은 점을 제외하고는 Task 반환에 Wait()를 호출과 유사 스레드를 차단하지 않습니다.