2016-03-08 2 views
3

Я пытаюсь получить статус присутствия lync данного пользователя. Мой код будет разговаривать с lync-сервером 2010, используя UCMA 4.0 в 64-битном env.Ждите уведомления асинхронный вызов

вот мой код, чтобы ждать асинхронного вызова, чтобы получить статус Lync.

private async void getNotifications(UserEndpoint endpoint, string useridSIP) 
{ 
    _userEndpoint.PresenceServices.BeginPresenceQuery(
     new[] { useridSIP }, 
     new[] { "state" }, 
     null, 
     (ar) => { 
      Task<List<RemotePresentityNotification>> notificationFetch = _userEndpoint.PresenceServices.EndPresenceQuery(ar).ToList<RemotePresentityNotification>(); 
      List<RemotePresentityNotification> result = await notificationFetch; 
      result.ForEach(x => { 
       LyncUser user = new LyncUser(); 
       if (x.AggregatedPresenceState != null) 
       { 
        user.Presence = x.AggregatedPresenceState.Availability.ToString(); 
       } 
       else 
       { 
        user.Presence = "Unknown"; 
       } 
       user.UserName = x.PresentityUri.ToString(); 
       usersWithStatus.Add(user); 
      }); 
     }, 
     null); 
} 

Я не знаю, как ждать, пока List<RemotePresentityNotification> результаты возвращаются

Task<List<RemotePresentityNotification>> notificationFetch = _userEndpoint.PresenceServices.EndPresenceQuery(ar).ToList<RemotePresentityNotification>(); 
List<RemotePresentityNotification> result = await notificationFetch; 

Весь исходный код.

using Microsoft.Rtc.Collaboration; 
using Microsoft.Rtc.Collaboration.Presence; 
using Oobe.Bobs.Lync.Models; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web; 

namespace xxxx.xxxx.xxxx 
{ 
    public class OneTimePresence 
    { 
     private UCMASampleHelper _helper; 
     private UserEndpoint _userEndpoint; 
     public List<LyncUser> usersWithStatus = new List<LyncUser>(); 
     public LyncPresenceChecker _checker { get; set; } 
     public OneTimePresence(string useridSIP, LyncPresenceChecker checker) 
     { 
      _checker = checker; 
      _helper = new UCMASampleHelper(); 
      string endpoint = String.Format("OneTime Presence query for {0}", useridSIP); 
      _userEndpoint = _helper.CreateEstablishedUserEndpoint(endpoint); 
      getNotifications(_userEndpoint, useridSIP); 
      _helper.ShutdownPlatform(); 

     } 
     protected void EndgetNotification(object sender, RemotePresentitiesNotificationEventArgs e) 
     { 
      e.Notifications.ToList<RemotePresentityNotification>().ForEach(x => 
      { 
       LyncUser user = new LyncUser(); 
       if (x.AggregatedPresenceState != null) 
       { 
        user.Presence = x.AggregatedPresenceState.Availability.ToString(); 
       } 
       else 
       { 
        user.Presence = "Unknown"; 
       } 
       user.UserName = x.PresentityUri.ToString(); 
       usersWithStatus.Add(user); 
      }); 
      _checker.Clients.All.updateLyncUserPresence(usersWithStatus); 

     } 

     private void getNotifications(UserEndpoint endpoint, string useridSIP) 
     { 
      _userEndpoint.PresenceServices.BeginPresenceQuery(
       new[] { useridSIP }, 
       new[] { "state" }, 
       EndgetNotification, 
       (ar) => { 
        ar.AsyncWaitHandle.WaitOne(); 
        List<RemotePresentityNotification> result = _userEndpoint.PresenceServices.EndPresenceQuery(ar).ToList<RemotePresentityNotification>(); 

        result.ForEach(x => 
        { 
         LyncUser user = new LyncUser(); 
         if (x.AggregatedPresenceState != null) 
         { 
          user.Presence = x.AggregatedPresenceState.Availability.ToString(); 
         } 
         else 
         { 
          user.Presence = "Unknown"; 
         } 
         user.UserName = x.PresentityUri.ToString(); 
         usersWithStatus.Add(user); 
        }); 
       }, 
       null); 
      if (usersWithStatus.Count > 0) 
      { 
       _checker.Clients.All.updateLyncUserPresence(usersWithStatus); 
      } 

     } 


    } 
} 
+0

Не использовать асинхронные пустоты. См. Статью [this] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx?f=255&MSPPError=-2147217396) для получения полного объяснения. Измените подпись метода getNotifications на async Task. Почему вы хотите дождаться результатов? –

+0

Сервер lync требует времени, чтобы вернуть статус, поэтому анонимный метод называется асинхронным. –

ответ

1

Я считаю, что вы ищете метод Task.Factory.FromAsync. Этот метод представляет собой обертку вокруг Begin и Endasync pattern - detailed here. Например, вы хотите сделать это вместо:

private async Task<List<RemotePresentityNotification>> GetNotifications(UserEndpoint endpoint, string useridSIP) 
{ 
    var task = Task.Factory.FromAsync(
     _userEndpoint.PresenceServices.BeginPresenceQuery, 
     _userEndpoint.PresenceServices.EndPresenceQuery, 
     new[] { useridSIP }, 
     new[] { "state" }); 

    var results = await task; 
    return results.ToList(); 
} 
  1. Избегайте async void подробные here
  2. Используйте async только при наличии соответствующего await

с этим на месте вы могли бы тогда await его и обрабатывать, как вы сочтете нужным:

private async Task SomeCaller(UserEndpoint endpoint, string useridSIP) 
{ 
    var list = await GetNotifications(endpoint, useridSIP); 
    // ... do stuff with it 
} 

Update 1

Рассмотрим то, чтобы PresenceServices фактически доступны, проверяя State также подробную here.

До тех пор, пока свойство State конечной точки установлено в установленное, все службы присутствия доступны для него.

Кроме того, this может быть полезно при взгляде.

+0

1. Вы говорите, чтобы опустить 'async', но затем не опускайте его. 2. Это не сработает, ['EndPresenceQuery'] (https://msdn.microsoft.com/en-us/library/office/hh366226.aspx) возвращает' IEnumerable ', поэтому для получения' List ', вам нужно будет называть' ToList() 'где-то (как и код в вопросе). – svick

+0

Дайте мне весь исходный код, и я могу вам помочь –

+0

Я не OP, у меня нет доступа к никакому другому коду, чем вы. – svick

Смежные вопросы